gpt4 book ai didi

r - 使用 Tidyverse 的简单管道中的 assign() 行为不一致

转载 作者:行者123 更新时间:2023-12-05 01:53:52 25 4
gpt4 key购买 nike

通过简单地更改连接步骤中的参数顺序,我可以让下面的代码运行。我刚刚安装了截至这篇文章 (1.3.1) 的最新版本的 Tidyverse,我使用的是 R 版本 4.1.1 (2021-08-10),“Kick Things”。请结束我的疯狂:

更新:

  • 如果您在没有连接语句的情况下运行管道,分配工作正常(奇数)
  • 我有一个旧版本的 tidyverse(我愚蠢地没有记录),代码可以运行。现在它不适用于最新版本的 tidyverse。不要让事情太复杂,但我是在另一台机器上用 R 版本 R 版本 3.6.3 (2020-02-29) 做的。
library(dplyr)

#Doesn't run
if(exists("test")) rm("test")
iris%>%
assign(x = "test",value = .,envir = .GlobalEnv)%>%
left_join(x = test,y =. ,by="Species")

#Runs
if(exists("test")) rm("test")
iris%>%
assign(x = "test",value = .,envir = .GlobalEnv)%>%
left_join(x = .,y =test ,by="Species")

最佳答案

管道在这里让事情变得有点困惑,但如果我们编写与嵌套函数相同的代码,我们会得到相同的效果:

#Doesn't run
if(exists("test")) rm("test")
left_join(x = test, y = assign("test", iris, envir = .GlobalEnv), by = "Species")

#Runs
if(exists("test")) rm("test")
left_join(x = assign("test", iris, envir = .GlobalEnv), y = test, by = "Species")

当您看到它是这样写的时,第一个版本无法运行的原因现在就明白了:您正在对一个不存在的对象调用 left_join;因为 left_join 是一个 S3 泛型,它只评估 x 以确定方法分派(dispatch),并将所有其他参数作为未评估的 promise 传递给 left_join.data.frame。由于 y 还没有被评估,test 没有被写入,所以我们得到一个 test not found 错误。

在第二个版本中,y 参数只有在 left_join.data.frame 中需要时才会被计算,并且在它被计算时,测试已经写好了。

所以这种奇怪的行为是惰性求值的结果。

关于r - 使用 Tidyverse 的简单管道中的 assign() 行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70961606/

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