提问人:Fredrik Karlsson 提问时间:11/23/2022 最后编辑:zephrylFredrik Karlsson 更新时间:11/24/2022 访问量:65
为什么我的...尽管我试图化解它们,但仍然评估了争论?
Why are my ... argmuments still evaluated despite me trying to defuse them?
问:
我正在努力在一种情况下化解我的论点,我不明白为什么。...
我可以制作这样的函数并适当地化解:...
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
为什么这些论点在这里没有被化解,而是在第一个例子中?
答:
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
然后,当您准备好进行评估时,您可以在内部使用。!!!dotArgs
dots_list()
评论