R使用ifelse和eval组合的行为

时间:2010-12-06 12:39:13

标签: r eval if-statement

免责声明:此代码是不好的做法。 ,只能使用类似错误的永远不要在真实情况下使用它。这个问题是关于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

但是,它没有解决问题......

2 个答案:

答案 0 :(得分:5)

这不是错误

命令结果在控制台上的'输出'是有条件的。这可以通过函数本身来确定 - 例如:

> f=function(x)x;
> g=function(x)invisible(x);
> f(1)
[1] 1
> g(2)
> .Last.value
[1] 2

该值仍然正常返回 - 它只是没有打印在控制台上。

这里发生的是eval标记其输出invisible,但repifelse没有,实际上有效地剥离了invisible属性输入

看来隐形是变量的特殊属性,并且不会通过rep操作传递。它也没有通过任务:

> h=function(x){y=x;y;}
> f(g(1))
> h(g(1))
[1] 1
>

有关更多背景信息,请参阅?invisible

答案 1 :(得分:2)

R总是评估ifelse命令的两个替代方案。您可以将其合理化为必要的,以便准备好选择每个向量中的哪个项目返回到调用环境。 if (cond) {affirm-conseq} else {neg-conseq}的情况恰恰相反。在查看ifelse的代码时,会显示基于第三个ifelse参数的评估而始终设置“dd”的基础。在“是” - 向量之后对“否” - 矢量代码进行评估,以便选择负向后向量中的哪些项目被分配给“ans” - 输出向量。