我正在研究R函数中的参数,但是在理解它的逻辑时遇到了一些问题。
h <- function(a = 1, b = d){
d <- (a + 1)^2
c(a, b)
}
h()
# [1] 1 4
我希望错误消息会返回,因为没有
b
的值。d
是在h
函数下创建的,但是没有像b = d
这样的代码在函数b
中为h
分配值。但是,结果是
[1] 1 4
。b
和d
如何链接? 最佳答案
默认函数参数值在R中是惰性计算的(即仅在需要时才计算):
有关示例,请参见此代码的输出:
printme <- function(name,x){cat('evaluating',name,'\n');x}
h <- function(a = printme('a',1), b = printme('b',d)){
cat('computing d...\n')
d <- (a + 1)^2
cat('d computed\n')
cat('concatenating a and b...\n')
c(a, b)
cat('a and b concatenated\n')
}
h()
控制台输出:
computing d...
evaluating a
d computed
concatenating a and b...
evaluating b
a and b concatenated
如您所见,
d
是在评估b
的默认值之前计算的编辑:
此外,正如@BrodieG在注释中正确指出的那样,默认参数在函数环境中求值;实际上,在上面的示例中,可以将
b
初始化为在函数环境中定义的变量d
的值。相反,当您指定一个参数(不使用默认值)时,仍会延迟计算分配该参数的表达式,但这一次是在调用环境中,例如:
# same functions as above, but this time we specify the parameters in the call
h(a=printme('a',123),b=printme('d',d))
控制台输出:
computing d...
evaluating a
d computed
concatenating a and b...
evaluating d
Error in printme("d", d) : object 'd' not found
请注意在评估参数
b
时的错误,因为在调用环境中找不到d
。