是否有一个便利功能可以将对象导出到全局环境,可以从一个函数调用它来使对象全局可用?
我正在寻找像
这样的东西export(obj.a, obj.b)
表现得像
assign("obj.a", obj.a, .GlobalEnv)
assign("obj.b", obj.b, .GlobalEnv)
我知道<<-
和assign
。我需要这个来重构旧的代码,这只是脚本的串联:
input("script1.R")
input("script2.R")
input("script3.R")
script2.R
使用script1.R
的结果,script3.R
可能使用1
和2
的结果。这会创建一个污染严重的命名空间,我想更改每个脚本
pollute <- the(namespace)
useful <- result
到
(function() {
pollute <- the(namespace)
useful <- result
export(useful)
})()
作为第一个廉价的对策。
答案 0 :(得分:6)
只需编写一个包装器:
myexport <- function(...) {
arg.list <- list(...)
names <- all.names(match.call())[-1]
for (i in seq_along(names)) assign(names[i],arg.list[[i]],.GlobalEnv)
}
fun <- function(a) {
ttt <- a+1
ttt2 <- a+2
myexport(ttt,ttt2)
return(a)
}
print(ttt)
#object not found error
fun(2)
#[1] 2
print(ttt)
#[1] 3
print(ttt2)
#[1] 4
没有彻底测试,也不确定&#34;安全&#34;那是。
答案 1 :(得分:2)
您可以创建环境变量并在导出功能中使用它。例如:
env <- .GlobalEnv ## better here to create a new one :new.env()
exportx <- function(x)
{
x <- x+1
env$y <- x
}
exportx(3)
y
[1] 4
例如,如果要在包中定义全局选项(模拟经典R选项),
my.options <- new.env()
setOption1 <- function(value) my.options$Option1 <- value
在OP澄清后编辑:
您可以使用带有2个参数的evalq
:
环境中要评估expr的环境 封面,其中R寻找在环境中找不到的物体。
这是一个例子:
env.script1 <- new.env()
env.script2 <- new.env()
evalq({
x <- 2
p <- 3
z <- 5
} ,envir = env.script1,enclos=.GlobalEnv)
evalq({
h <- x +2
} ,envir = env.script2,enclos=myenv.script1)`
您可以看到所有变量都是在环境中创建的(如local
)
env.script2$h
[1] 4
env.script1$p
[1] 3
> env.script1$x
[1] 2
答案 2 :(得分:0)
首先,考虑到您的用例,我没有看到export
函数如何比使用好的(?)老式<<-
更好。你可以做到
(function() {
pollute <- the(namespace)
useful <<- result
})()
将提供与示例中相同的结果。
其次,使用local
似乎更好的形式,而不是匿名函数,它允许您运行相关的计算,而不会乱丢您的工作区与各种临时对象。
local({
pollute <- the(namespace)
useful <<- result
})
ETA:如果无论出于何种原因避免修改名为useful
的现有变量,请务必进行exists
检查。这同样适用于所提出的其他解决方案。
local({
.....
useful <- result
if(!exists("useful", globalenv())) useful <<- useful
})