Jor*_*eys 7 if-statement eval r
免责声明:这段代码是不好的做法.,只会因为类似bug的东西而起作用.切勿在真实情况下使用它.这个问题是关于R的有趣行为,没有别的.
看完这个问题后,我非常困惑.显然,ifelse可以访问应该隐藏的信息.
说我们这样做:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
Run Code Online (Sandbox Code Playgroud)
我们没有输出.逻辑,因为两个表达式实际上是向量dd的赋值.eval()不应该给出输出.但奇怪的是,当你尝试有趣的代码时
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
Run Code Online (Sandbox Code Playgroud)
你得到输出??? 有人对此有解释吗?
它并不像"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
Run Code Online (Sandbox Code Playgroud)
编辑:
仔细看看ifelse的源代码,可以看出确保发生这种情况的一行是rep():
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
Run Code Online (Sandbox Code Playgroud)
不过,它没有解决问题......
这不是一个错误
控制结果的控制台上的'输出'是有条件的.这可以通过函数本身来确定 - 例如:
> f=function(x)x;
> g=function(x)invisible(x);
> f(1)
[1] 1
> g(2)
> .Last.value
[1] 2
Run Code Online (Sandbox Code Playgroud)
该值仍然正常返回 - 它只是没有打印在控制台上.
这里发生的是eval标记它的输出invisible,但rep并ifelse没有,而事实上有效剥离invisible财产了他们的输入.
看来,invisible是变量的特殊属性,不会通过rep操作传递.它也没有通过任务:
> h=function(x){y=x;y;}
> f(g(1))
> h(g(1))
[1] 1
>
Run Code Online (Sandbox Code Playgroud)
请参阅?invisible更多背景信息.