如果我声明一个函数,我可以引用之前的参数:
输出为:
然而,以下内容无法正常工作:
函数中的第一条语句被执行,然后是
blah <- function( a=1, b=a ) { print(sprintf("a=%d, b=%d", a, b)) }
输出为:
> blah(10)
[1] "a=10, b=10"
> blah(10, b=30)
[1] "a=10, b=30"
然而,以下内容无法正常工作:
> blah(a=10, b=a)
Error in sprintf("a=%d, b=%d", a, b) : object 'a' not found
实际上,这更或多或少是人们所期望的;那么为什么声明blah <- function(a=10, b=a)
会起作用?为什么这里的作用域与调用函数时不同?
另外,为什么只有在调用sprintf
时才出现错误?为什么不在调用函数时立即抛出错误?我很困惑。
编辑:
在这里解释我的困惑。当我声明一个函数时,参数不会被评估。R具有惰性求值,变量在需要时才会被评估。考虑一下:
> blah <- function( a=1, b=print("foo") ) { print( "So far, so good") ; print( b ) }
>
没有进行评估。现在我正在调用 blah:
> blah()
[1] "So far, so good"
[1] "foo"
[1] "foo"
函数中的第一条语句被执行,然后是
print("foo")
。然而,在此时,a已经在函数作用域中。那么为什么b=a
不会被执行呢?当它发生时,我们已经在函数中了,a已经被声明了。
编辑2:
在您得出错误结论之前,请注意,在R函数声明中引用先前的参数完全没有问题,这是由于R的惰性评估。我不明白的是,为什么在函数声明中它可以工作,但在调用时却不能。我并不是说它应该或不应该工作,只是想知道作用域的基本机制。
a = 150
,那么它就可以工作了。你函数中的"a"和环境中的"a"是不同的对象。 - user3710546blah <- function(a=10, b=a) { }
,然后执行ls()
。 - user3710546