用于将对象导出到全局环境的便捷功能

时间:2013-07-05 08:48:59

标签: r convenience-methods

  

更新:我添加了a variant   Roland's implementationkimisc package

是否有一个便利功能可以将对象导出到全局环境,可以从一个函数调用它来使对象全局可用?

我正在寻找像

这样的东西
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可能使用12的结果。这会创建一个污染严重的命名空间,我想更改每个脚本

pollute <- the(namespace)
useful <- result

(function() {
pollute <- the(namespace)
useful <- result
export(useful)
})()

作为第一个廉价的对策。

3 个答案:

答案 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
})