2

更新:我在 kimisc 包中添加了Roland 实现变体

是否有将对象导出到全局环境的便捷函数,可以从函数中调用该函数以使对象全局可用?

我正在寻找类似的东西

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

作为第一个廉价的对策。

4

3 回答 3

7

只需编写一个包装器:

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

没有经过彻底测试,也不确定这有多“安全”。

于 2013-07-05T08:57:49.317 回答
3

您可以创建一个环境变量并在导出函数中使用它。例如:

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澄清后编辑:

您可以使用evalqwhich take 2 个参数:

envir 将在其中评估 expr 的环境,其中 R 查找未在 envir 中找到的对象。

这里有一个例子:

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

您可以看到所有变量都是在环境中创建的(like local

 env.script2$h
[1] 4
env.script1$p
[1] 3
> env.script1$x
[1] 2
于 2013-07-05T09:10:09.743 回答
0

首先,考虑到您的用例,我看不出一个export函数比使用 good (?) old-fashioned 更好<<-。你可以做

(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
})
于 2013-07-05T10:33:04.143 回答