繁体   English   中英

你如何引用 R 中的函数环境?

[英]How do you refer to a function's environment in R?

我收到以下错误,因为我相信我正在做的clusterExport()parallel包)指的是错误的环境:

Error in get(name, envir = envir) : object 'simulatedExpReturn' not found

我在一个函数中得到了这个,特别是在这部分的clusterExport()行:

  simulatedExpReturn = list()

  # Calculate the number of cores
  no_cores <- detectCores()

  # Initiate cluster
  cl <- makeCluster(no_cores)

  clusterExport(cl, c("simulatedExpReturn",
                  "covariance",
                   "numAssets",
                   "assetNames",
                   "numTimePoints-lag",
                   "stepSize"), envir = environment(Michaud1998MonteCarlo))

covariancenumAssetsassetNamesnumTimePoints-lagstepSize都被传递到函数中。 我也试过envir = envirenvir = .GlobalEnv都没有奏效。

如何解决这个问题?

通过名称将变量传递给另一个函数的简单示例:

print.variable.from.env <- function (x,e) { cat("Echoing", get(x, envir = e)) }

my.f <- function()
{
    my.local <- "my local "
    print.variable.from.env("my.local", environment())

}

my.f()

如果你运行它,它会简单地打印

Echoing my local 

即通过将环境传递给print.variable.from.env ,该函数能够访问由其名称在x给出的变量

再举一个例子:

print.variable.from.env <- function (x,e) { cat("Echoing", get(x, envir = e), "\n") }

my.f <- function()
{
    my.local <- "my local "
    print.variable.from.env("my.local", environment())
    print.variable.from.env("global.variable", parent.env(environment()))
}

global.variable <- "global"

my.f()

这显示了从函数的父环境对“global.variable”的访问。 执行时它会打印

Echoing my local  
Echoing global 

这是一个范围问题, clusterExport函数正在指定环境中搜索您的对象,并将它们导出到每个处理器的子环境。 它不会搜索.GlobalEnv您在其中定义simulatedExpReturn

这就是为什么以下返回1而不是空列表的原因:

> Michaud1998MonteCarlo <- new.env()
> simulatedExpReturn = list()
> assign("simulatedExpReturn", 1, envir = Michaud1998MonteCarlo)
> 
> # Calculate the number of cores
> no_cores <- detectCores()
> 
> # Initiate cluster
> cl <- makeCluster(no_cores)
> 
> clusterExport(cl, c("simulatedExpReturn"), envir = Michaud1998MonteCarlo)
> clusterCall(cl, function() simulatedExpReturn)
[[1]]
[1] 1

[[2]]
[1] 1

[[3]]
[1] 1

[[4]]
[1] 1

要解决,只需在运行clusterExport之前将值分配给环境:

assign("simulatedExpReturn", list(), envir = Michaud1998MonteCarlo)

或者更简单,如果您只想访问调用者的环境:

print.variable.from.env <- function (x) { 
    cat("Echoing", get(x, envir = parent.frame())) 
}

my.f <- function() {
    my.local <- "my local "
    print.variable.from.env("my.local")
}

my.f()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM