【发布时间】:2010-12-06 12:39:13
【问题描述】:
免责声明:此代码是不好的做法。,并且仅由于类似错误的原因而起作用。 切勿在真实情况下使用它。这个问题是关于 R 的有趣行为,仅此而已。
读完this question后,我很困惑。显然,ifelse 可以访问应该隐藏的信息。
说我们做:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
我们没有输出。逻辑,因为这两个表达式实际上都是向量 dd 的赋值。 eval() 不应该给出输出。但奇怪的是,当你尝试有趣的代码时
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
你得到输出???有人对此有解释吗?
这并不像“R 评估然后使用 dd”那么简单。无论你给 z 什么顺序,无论你使用什么条件,dd 总是最后提到的eval()。
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> z <- c(0,1)
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(y),eval(x))
> dd
[1] 1 2 3
编辑:
仔细查看 ifelse 的源代码表明,确保发生这种情况的行是 rep():
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
但是,它并没有解决问题......
【问题讨论】:
-
可能 eval 返回不可见对象。
-
@koshke :好像是这样。 str(eval(x)) 给出对象。把它作为答案,我会接受。
标签: r eval if-statement