为何R语言中尝试化解...参数,参数仍被求值?
问题原因
你的两个函数调用的问题本质不是...没被处理,而是传入参数的类型+rlang::dots_list的默认求值逻辑导致的:
- 第一个调用
fill_na(df, colA="c", colB=2)里,传给...的是直接的字面量("c"、2),这些值本身就存在,dots_list求值时自然没问题。 - 第二个调用
myFun(inside_of=ae, from_what=forest, fs=fm, fbw=bw)里,fs=fm、fbw=bw中的fm、bw是没定义过的变量名。而rlang::dots_list默认会对...里的每个参数求值(.eval=TRUE是默认设置),R找不到fm这个对象,自然就报错了。
解决办法
分两种情况处理:
情况1:你确实要传变量值
先把fm、bw这些变量定义好再调用函数:
# 先定义需要的变量 fm <- 16000 # 示例值,替换为你实际需要的内容 bw <- 200 # 再调用函数 myFun(inside_of=ae, from_what=forest, fs=fm, fbw=bw)
情况2:你想捕获变量名而非值
如果只是想把fs=fm这种符号关系存下来,不想让R立刻求值,给dots_list加个.eval=FALSE参数就行:
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", .eval=FALSE) return(dotArgs) # 此时返回的是包含符号的列表,不会报错 } # 现在调用就不会报错,会返回捕获的参数列表 myFun(inside_of=ae, from_what=forest, fs=fm, fbw=bw)
额外说明
rlang::dots_list默认会强制对...里的参数求值,和基础R的list(...)行为一致。如果需要保留原始的符号表达式、延迟求值,必须显式设置.eval=FALSE。
内容的提问来源于stack exchange,提问作者Fredrik Nylén
相关产品推荐
相关产品推荐

