r – 懒惰评估:为什么我不能使用plot(…,xlim = c(0,1),ylim = xlim)?

前端之家收集整理的这篇文章主要介绍了r – 懒惰评估:为什么我不能使用plot(…,xlim = c(0,1),ylim = xlim)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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

猜你在找的C&C++相关文章