懒惰评价:为什么我不能使用情节(...,xlim = c(0,1),ylim = xlim)?

Hen*_*rik 10 r lazy-evaluation argument-passing

其中一个R最大的特点就是懒惰的评价.这导致了经常遇到的样式,即可以使用参数作为另一个参数的值.例如,在Hadley关于Advanced R的伟大着作中,您会看到以下示例:

g <- function(a = 1, b = a * 2) {
  c(a, b)
}
g()
#> [1] 1 2
g(10)
#> [1] 10 20
Run Code Online (Sandbox Code Playgroud)

现在,我想用xlim和做同样的情节ylim,但是,它不起作用:

> plot(1, 1, ylim = c(0,1), xlim = ylim)
Error in plot.default(1, 1, ylim = c(0, 1), xlim = ylim) : 
  object 'ylim' not found
> plot(1, 1, xlim = c(0,1), ylim = xlim)
Error in plot.default(1, 1, xlim = c(0, 1), ylim = xlim) : 
  object 'xlim' not found
Run Code Online (Sandbox Code Playgroud)
  • 有人知道为什么吗?
  • 有没有办法实现这个目标?

Jos*_*ien 13

引用好的手册:

4.3.3论证评估

评估函数参数的最重要的事情之一是提供的参数和默认参数的处理方式不同.在函数的评估框架中计算提供的函数参数.函数的默认参数在函数的求值框架中计算.

要查看实际意义,请创建一个函数,其中一个参数的默认值是另一个参数值的函数:

f <- function(x=4, y=x^2) {
    y
}
Run Code Online (Sandbox Code Playgroud)

当所谓y默认值,R看起来评估y在该函数的整个身体被评估的函数调用,即在同样的环境的评价框架-一个地方,x有很好的更好(当然不)存在:

f() 
# [1] 16
Run Code Online (Sandbox Code Playgroud)

当与一个名为提供的值y,R看起来调用函数(这里的全球环境)的评估框架,没有发现x,并且让你在它的错误消息,知道这样:

f(y=x^2)
# Error in f(y = x^2) : object 'x' not found
Run Code Online (Sandbox Code Playgroud)


mer*_*011 5

这里有一个范围问题.在语句中plot(1, 1, ylim = c(0,1), xlim = ylim),名称ylim仅作为参数的名称提供,并且通常不对调用者可用.

对于要在赋值右侧使用的变量,它必须在调用范围中可用.

你的第一个例子作品的原因是因为你写默认参数成函数定义,它确实可以访问所有的参数.

一个可能的解决方法,它才有意义,如果这是同样的,你在很多情况下要默认,是包装的情节功能具有此行为的新功能.

myplot <- function(x, y, ylim, xlim = ylim,...) {
  plot(x,y, ylim = ylim, xlim = xlim,...)
}

myplot(1,1, ylim=c(0,1))
Run Code Online (Sandbox Code Playgroud)