为什么我的...尽管我试图化解它们,但仍然评估了争论?

Why are my ... argmuments still evaluated despite me trying to defuse them?

提问人:Fredrik Karlsson 提问时间:11/23/2022 最后编辑:zephrylFredrik Karlsson 更新时间:11/24/2022 访问量:65

问:

我正在努力在一种情况下化解我的论点,我不明白为什么。...

我可以制作这样的函数并适当地化解:...

library(dplyr)
library(tidyr)

fill_na <- function(.x,...){

  dotArgs <- rlang::dots_list(...,.named=TRUE,.homonyms="last")
  tidyr::replace_na(.x,dotArgs)  

}

df <- tibble::tribble(
  ~colA, ~colB,
  "a",   1,
  "b",   2,
  "c",   NA,
  NA,    4
)

> fill_na(df,colA="c",colB=2)
# A tibble: 4 × 2
  colA   colB
  <chr> <dbl>
1 a         1
2 b         2
3 c         2
4 c         4

太好了,但是如果我做这个功能

myFun <- function(inside_of,from_what, ... ,.metadata_defaults=list("Gender"="Undefined","Age"=35),.by_maxFormantHz=TRUE,.recompute=FALSE,.package="superassp"){

    dotArgs <- rlang::dots_list(...,.named=TRUE,.homonyms="last")
    return(1)

}

我得到这个结果:

> myFun(inside_of=ae,from_what=forest,fs=fm, fbw=bw)
Error in rlang::dots_list(..., .named = TRUE, .homonyms = "last") : 
  object 'fm' not found

为什么这些论点在这里没有被化解,而是在第一个例子中?

r 参数传递 RLANG 非标准评估

评论


答:

5赞 zephryl 11/23/2022 #1

这些点不会在您的任何一个函数中被化解。根据文档,“评估......并将它们作为清单返回“(着重号后加)。你只是在你的函数中没有注意到它,因为你没有给它传递一个未定义的变量,所以缺乏化解不会引起任何问题。dots_list()fill_na()

如果要化解这些点,请使用 。enquos()

myFun <- function(inside_of,
                  from_what,
                  ...,
                  .metadata_defaults = list("Gender" = "Undefined", "Age" = 35),
                  .by_maxFormantHz = TRUE,
                  .recompute = FALSE,
                  .package = "superassp") {
    dotArgs <- rlang::enquos(...)
    return(1)
}

myFun(inside_of = ae, from_what = forest, fs = fm, fbw = bw)
# 1

然后,当您准备好进行评估时,您可以在内部使用。!!!dotArgsdots_list()