【问题标题】:Calling an R function in a different environment在不同的环境中调用 R 函数
【发布时间】:2018-04-04 00:31:01
【问题描述】:

我觉得这样做应该相当简单,但我终其一生都找不到解决方案……我想在与它所在的环境不同的环境中评估 R 函数。

我想要什么:

# A simple function
f <- function() {
  x + 1
}

# Create an env and assign x <- 3
env <- new.env()
assign("x", 3, envir = env)

# Call f on env
call_on_env(f, env)
#> 4

我最接近“call_on_env()”的是:

# Quote call and evaluate
quo <- quote(f())
eval(quo, envir = env)

不幸的是,上面的代码返回了一个错误:Error in f() : object 'x' not found。那么……有没有办法让我在env 上评估f()

编辑:我可以将f() 发送到env 然后调用它,但这会将f() 永久留在那里。对于上下文 [见下文],我想与一些预加载的包并行调用该函数。

上下文:我正在与parallel::clusterMap() 并行调用一个函数,并且我希望在我的全局环境中加载的包也能够加载到集群上。据我所知,parallel::clusterExport() 只能导出变量列表,所以对我不起作用...

【问题讨论】:

    标签: r parallel-processing eval environment rlang


    【解决方案1】:

    f 移动到env

    environment(f) <- env
    f()
    # [1] 4
    

    注意:正如您在此处遇到的,跨不同环境评估对象是不可取的。最好将您计划与彼此交互的所有对象保持在同一环境中。

    如果你不想改变f的环境,你可以把上面所有的东西放到一个新的函数中。

    fx <- function(f, env) {
        environment(f) <- env
        f()
    }
    fx(f, env)
    # [1] 4
    

    【讨论】:

    • 感谢您的回答!但是有没有办法暂时做到这一点?使用您的解决方案,我现在无法调用envf() outside,因为它已被永久移动到那里。我已经编辑了我的问题以反映这一要求。
    【解决方案2】:

    source() 函数可能会有所帮助:

    source('scriptfilename.R')
    

    如果文件位于另一个路径,则使用:

    source('YOURPATH/scriptfilename.R')
    

    当您运行source() 时,它会将所有功能拉入您当前的环境中。然后,您可以引用它所在的 R 脚本中包含的任何函数。

    但是,我不建议您在 R 项目文件夹结构之外引用函数/脚本,因为如果您与他人共享您的 R 项目文件夹,链接将会中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多