gpt4 book ai didi

R 结合使用 ifelse 和 eval 的行为

转载 作者:行者123 更新时间:2023-12-04 12:00:34 24 4
gpt4 key购买 nike

免责声明:此代码是不好的做法。 ,并且仅由于类似错误的东西而起作用。 切勿在真实情况下使用它。这个问题是关于 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

然而,它并没有解决问题......

最佳答案

这不是错误

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

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

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

这里发生的是 eval标记其输出 invisible但是 repifelse不,实际上有效地剥离了 invisible属性关闭他们的投入。

看起来 invisible 是变量的一个特殊属性,不会通过 rep 操作传递。它也没有通过赋值传递:
> h=function(x){y=x;y;}
> f(g(1))
> h(g(1))
[1] 1
>

?invisible了解更多背景。

关于R 结合使用 ifelse 和 eval 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4366463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com