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

时间:2015-09-25 15:04:05

标签: r environment

我收到以下错误,因为我认为我正在做的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,但都没有效果。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

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()

这显示了对&#34; global.variable&#34;的访问权限。来自function的父母env。 执行时,它将打印

Echoing my local  
Echoing global 

答案 1 :(得分:1)

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

这就是为什么以下内容返回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

答案 2 :(得分:0)

或更简单的是,如果您只想访问呼叫者的环境:

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()