我正在学习关于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
不能在调用环境中找到。