R';结合使用ifelse和eval的行为

R';结合使用ifelse和eval的行为,r,eval,if-statement,R,Eval,If Statement,免责声明:此代码是一种不好的做法。,仅在出现类似bug的情况下才有效不要在实际情况中使用它。这个问题与R的有趣行为有关,仅此而已。 读完这本书后,我感到很困惑。显然,ifelse可以访问应该隐藏的信息 假设我们这样做: > x <- expression(dd <- 1:3) > y <- expression(dd <- 4:6) > z <- c(1,0) > eval(x) > eval(y) > 你得到

免责声明:此代码是一种不好的做法。,仅在出现类似bug的情况下才有效不要在实际情况中使用它。这个问题与R的有趣行为有关,仅此而已。

读完这本书后,我感到很困惑。显然,ifelse可以访问应该隐藏的信息

假设我们这样做:

> x <- expression(dd <- 1:3)    
> y <- expression(dd <- 4:6)    
> z <- c(1,0)

> eval(x)
> eval(y)
>
你得到输出了吗???有人对此有解释吗

它不像“R计算然后使用dd”那么简单。无论您给z的顺序是什么,使用的条件是什么,dd总是最后提到的
eval()


尽管如此,它还是不能解决问题…

这不是一个bug

控制台上命令结果的“输出”是有条件的。这可以由函数本身确定-例如:

> f=function(x)x;
> g=function(x)invisible(x);
> f(1)
[1] 1
> g(2)
> .Last.value
[1] 2
返回的值仍然很好-只是没有打印在控制台上

这里发生的是
eval
标记其输出
不可见
,但
rep
ifelse
不标记,事实上有效地将
不可见
属性从其输入中去除

看起来不可见是变量的一个特殊属性,不通过rep操作传递。它也没有通过分配传递:

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

有关更多背景信息,请参见
?不可见的

R始终计算
ifelse
命令的两个备选方案。您可以根据需要对此进行合理化,以便准备好选择每个向量中要返回调用环境的项。反之,if(cond){affirm conseq}else{neg conseq}
。当on查看
ifelse
的代码时,会显示“dd”始终基于对第三个ifelse参数的求值进行设置的基础。“否”-向量代码在“是”-向量之后求值,以便选择负结果向量中的哪些项被分配给“ans”-输出向量。

可能eval返回不可见对象。@koshke:似乎是这样。str(eval(x))给出对象。把它作为答案,我会接受的。非常正确。对于示例,我显然完全误解了
eval()
函数。这就是我所能理解的。我只是错过了eval()总是返回一个对象,尽管它是一个不可见的对象。
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
> f=function(x)x;
> g=function(x)invisible(x);
> f(1)
[1] 1
> g(2)
> .Last.value
[1] 2
> h=function(x){y=x;y;}
> f(g(1))
> h(g(1))
[1] 1
>