【问题标题】:R's behaviour using ifelse and eval in combination结合使用 ifelse 和 eval 的 R 行为
【发布时间】: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


【解决方案1】:

这不是错误

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

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

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

这里发生的是 eval 标记其输出 invisiblerepifelse 没有,实际上有效地将 invisible 属性从其输入中剥离。

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

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

更多背景信息请参见?invisible

【讨论】:

  • 非常正确。感谢这些例子,我显然完全误解了eval() 函数。
【解决方案2】:

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

【讨论】:

  • 就我所知。我只是错过了 eval() 总是返回一个对象,尽管是一个不可见的对象。
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多