【发布时间】:2015-10-12 00:20:13
【问题描述】:
我了解到在函数中使用可选参数并使用 missing() 检查它们是一种常见的做法 (例如SO 22024082 中讨论的)
在本例中,round0 是可选参数(我知道,round0 可以定义为逻辑参数)。
foo = function(a, round0) {
a = a * pi
if(!missing(round0)) round(a)
else a
}
但是如果我从另一个函数调用这个函数,我怎么能传递“缺失”呢?
bar = function(b) {
if(b > 10) round1=T
foo(b, round1)
}
如果 b
foo = function(a, round0) {
a = a * pi
print(missing(round0))
print(round0)
if(!missing(round0)) round(a)
else a
}
并运行 bar(9) 输出为:
bar(9)
[1] FALSE
Error in print(round0) : object 'round1' not found
Called from: print(round0)
也就是说:round0没有丢失,但也无法访问?
我不想在 bar() 中使用不同的函数调用,如果 foo() 中有多个可选参数,我将不得不为每个丢失/未丢失的所有可选参数的组合编写一个函数调用。
是否可以通过“缺失”,或者其他解决方案适用于这个问题?
【问题讨论】:
-
通常,如果你以特定的形式调用一个函数,你应该确保你有所有的参数。在这里,我将在
bar的开头添加一个round1=F,并将foo更新为if(!missing(round0) && round0)。缺少允许你调用foo(a)或foo(a,T/F),如果你用两个参数调用它,第二个参数不会丢失并且必须是可解析的。 -
我的猜测是
missing在表示函数参数的承诺对象具有非空表达式槽时立即返回FALSE。在修改后的foo函数中在a = a * pi之后添加行print(substitute(round0)),然后执行foo(9)。substitute将提取表达式槽。它不会打印任何内容,即round0的空表达式槽。现在试试bar(9)。这将打印round1。但是当您使用print时,R 将尝试评估尚未定义的round1(惰性评估)。
标签: r arguments function-calls