为什么我的……论点仍然被评估,尽管我试图化解它们?

Fre*_*son 5 r parameter-passing non-standard-evaluation rlang

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

\n

我可以创建一个这样的函数并...适当地化解:

\n
library(dplyr)\nlibrary(tidyr)\n\nfill_na <- function(.x,...){\n\n  dotArgs <- rlang::dots_list(...,.named=TRUE,.homonyms="last")\n  tidyr::replace_na(.x,dotArgs)  \n\n}\n\ndf <- tibble::tribble(\n  ~colA, ~colB,\n  "a",   1,\n  "b",   2,\n  "c",   NA,\n  NA,    4\n)\n\n> fill_na(df,colA="c",colB=2)\n# A tibble: 4 \xc3\x97 2\n  colA   colB\n  <chr> <dbl>\n1 a         1\n2 b         2\n3 c         2\n4 c         4\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
myFun <- function(inside_of,from_what, ... ,.metadata_defaults=list("Gender"="Undefined","Age"=35),.by_maxFormantHz=TRUE,.recompute=FALSE,.package="superassp"){\n\n    dotArgs <- rlang::dots_list(...,.named=TRUE,.homonyms="last")\n    return(1)\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我得到这个结果:

\n
> myFun(inside_of=ae,from_what=forest,fs=fm, fbw=bw)\nError in rlang::dots_list(..., .named = TRUE, .homonyms = "last") : \n  object 'fm' not found\n
Run Code Online (Sandbox Code Playgroud)\n

为什么这里的争论没有被化解,而在第一个例子中却被化解了?

\n

zep*_*ryl 5

这些点在您的任何一个函数中都被消除了。根据文档dots_list()\xe2\x80\x9c评估包含在其中的所有参数...并将它们作为列表返回\xe2\x80\x9d(添加了强调)。您只是在函数中没有注意到它,fill_na()因为您没有向其传递未定义的变量,因此缺乏解构不会导致任何问题。

\n

如果您想消除这些点,请使用enquos().

\n
myFun <- function(inside_of,\n                  from_what,\n                  ...,\n                  .metadata_defaults = list("Gender" = "Undefined", "Age" = 35),\n                  .by_maxFormantHz = TRUE,\n                  .recompute = FALSE,\n                  .package = "superassp") {\n    dotArgs <- rlang::enquos(...)\n    return(1)\n}\n\nmyFun(inside_of = ae, from_what = forest, fs = fm, fbw = bw)\n# 1\n
Run Code Online (Sandbox Code Playgroud)\n

当您\xe2\x80\x99准备好评估时,您可以使用!!!dotArgs内部。dots_list()

\n