gpt4 book ai didi

r - magrittr 包中的管道不适用于函数 load()

转载 作者:行者123 更新时间:2023-12-04 07:53:14 29 4
gpt4 key购买 nike

看来%>% magrittr 包中的功能不适用于 load() .这是我重现我的问题的最小示例。

## Create two example variables and save to tempdir()
a <- 1
b <- 1

save(list = ls(), file = file.path(tempdir(), 'tmp.RData'))

## Remove all variables and load into global environment
# rm(list = ls())

load(file.path(tempdir(), 'tmp.RData'))
ls()
# [1] "a" "b"

# Write the same code with pipe "%>%", but not variable is loaded
# rm(list =ls())
library(magrittr)

tempdir() %>% file.path('tmp.RData') %>% load
ls()
# character(0)

我不明白为什么管道不适用于 load() .感谢您的任何建议。

最佳答案

envir load() 中的参数需要指定为 globalenv()parent.frame(3) .

# in a fresh R session ...
a <- 1
b <- 1
save(list = ls(), file = file.path(tempdir(), 'tmp.RData'))

# in another fresh session ...
ls()
# character(0)
tempdir() %>% file.path("tmp.RData") %>% load(envir = globalenv())
ls()
# [1] "a" "b"

以下也有效:
tempdir() %>% file.path("tmp.RData") %>% load(envir = parent.frame(3))

我将尝试解释原因。当您调用 load()从任何环境中,该函数都会在父环境中加载新对象。

现在,全局环境 globalenv()是您的 R 工作区。因此,如果您从全局环境(即工作区)调用 load ,一切都会按您的预期进行。想象一下:
  • 全局环境
  • load()

  • 但是,如果您调用 load()从函数内部,然后您在负载和全局环境之间插入了一个环境。想象一下:
  • 全局环境
  • 功能
  • load()

  • 这正是您输入 %>% 时发生的情况。混合:
  • 全局环境
  • %>%
  • load()

  • 有两种解决方案可以解决此问题。要么明确指向 globalenv()或者使用 parent.frame(3) 沿着链条向上走 3 步到全局环境。 .

    注:有一个 issue reported on GitHub为了这。不确定决议是什么,或者是否还有一个。这个问题刚刚在 9 月份被报道。

    非常感谢@Andrie 改进了这个解释。

    关于r - magrittr 包中的管道不适用于函数 load(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27053935/

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