我收到以下错误,因为我认为我正在做的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
,但都没有效果。
如何解决这个问题?
答案 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()