[英]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))
covariance
、 numAssets
、 assetNames
、 numTimePoints-lag
和stepSize
都被传递到函数中。 我也试过envir = envir
和envir = .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.