gpt4 book ai didi

r - clusterExport、环境和变量范围

转载 作者:行者123 更新时间:2023-12-04 12:04:08 24 4
gpt4 key购买 nike

我写了一个函数,我在其中定义变量和加载对象。这是一个简化版本:

fn1 <- function(x) {
load("data.RData") # a vector named "data"
source("myFunctions.R")
library(raster)
library(rgdal)

a <- 1
b <- 2
r1 <- raster(ncol = 10, nrow = 10)
r1 <- init(r1, fun = runif)
r2 <- r1 * 100
names(r1) <- "raster1"
names(r2) <- "raster2"
m <- stack(r1, r2) # basically, a list of two rasters in which it is possible to access a raster by its name, like this: m[["raster1"]]

c <- fn2(m)
}

函数“fn2”可以在“myFunctions.R”中找到,定义为:
fn2 <- function(x) {
fn3 <- function(y) {
x[[y]] * 100 * data
}

cl <- makeSOCKcluster(8)
clusterExport(cl, list("x"), envir = environment())
clusterExport(cl, list("a", "b", "data"))
clusterEvalQ(cl, c(library(raster), library(rgdal), rasterOptions(maxmemory = a, chunksize = b)))
f <- parLapply(cl, names(x), fn3)
stopCluster(cl)
}

现在,当我运行 fn1 时,我收到如下错误:
Error in get(name, envir = envir) : object 'a' not found

根据我对 ?clusterExport 的了解,envir 的默认值为 .GlobalEnv,因此我假设 fn2 可以访问“a”和“b”。然而,情况似乎并非如此。如何访问“a”和“b”所属的环境?

到目前为止,我发现的唯一解决方案是将“a”和“b”作为参数传递给 fn2。有没有办法在 fn2 中使用这两个变量而不将它们作为参数传递?

非常感谢你的帮助。

最佳答案

调用 clusterExport(cl, list("a", "b", "data")) 时遇到错误因为clusterExport正在尝试在 .GlobalEnv 中查找变量, 但是 fn1没有在 .GlobalEnv 中设置它们但在它自己的本地环境中。

另一种方法是通过 fn1 的本地环境至fn2 ,并将该环境指定为 clusterExport .调用 fn2将会:

c <- fn2(m, environment())

如果 fn2 的参数是 function(x, env) ,然后调用 clusterExport将会:
clusterExport(cl, list("a", "b", "data"), envir = env)

由于环境是通过引用传递的,因此这样做应该没有性能问题。

关于r - clusterExport、环境和变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20205819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com