R的最大特点之一是懒惰的评估.这导致经常遇到的样式,可以使用参数作为另一个参数的值.例如,在哈德利的
Advanced R年的好书中,你看到了
this example:
g <- function(a = 1,b = a * 2) { c(a,b) } g() #> [1] 1 2 g(10) #> [1] 10 20
现在,我想用xlim和ylim做同样的事情,但是它不起作用:
> plot(1,1,ylim = c(0,1),xlim = ylim) Error in plot.default(1,xlim = ylim) : object 'ylim' not found > plot(1,xlim = c(0,ylim = xlim) Error in plot.default(1,ylim = xlim) : object 'xlim' not found
有谁知道为什么?
有没有办法仍然实现这一点?
解决方法
Quoting from the good manual:
4.3.3 Argument evaluation
One of the most important things to know about the evaluation of
arguments to a function is that supplied arguments and default
arguments are treated differently. The supplied arguments to a
function are evaluated in the evaluation frame of the calling
function. The default arguments to a function are evaluated in the
evaluation frame of the function.
要看看这在实践中意味着什么,创建一个函数,其中一个参数的默认值是另一个参数的值的函数:
f <- function(x=4,y=x^2) { y }
当用y的默认值调用时,R看起来在函数调用的评估框架中评估y,即在整个函数的整体被评估的同一个环境中 – 一个x已经好得多的地方确实存在:
f() # [1] 16
当用提供的值y调用时,R在调用函数的评估框(在这里是全局环境)中查找,找不到x,并让它在其错误信息中知道:
f(y=x^2) # Error in f(y = x^2) : object 'x' not found