R中的阴影变量

时间:2013-06-19 08:42:38

标签: r variables scope variable-assignment

我想做一些不寻常的事情......

我在全局范围内创建了一个变量,但是,我想在函数中使用它来自字符串。

通常,我会使用

abc <- eval(parse(text=paste(test, "_ext", sep = "")))

并在函数末尾用abc更新test_ext。在这种特殊情况下,这是不可能的,所以我想创建一些......

a <- 10 #global scope
b <- 5  #global scope
test <- function(letter)
{
    letter <<- letter + 10
}
test("b")

一旦更新letter,就会更新b

这可能吗?

2 个答案:

答案 0 :(得分:1)

以下是应该执行此操作的方式:

mylist <- list(a=10, b=5)
# $a
# [1] 10
# 
# $b
# [1] 5

test <- function(funlist,letter)
{
  funlist[[letter]] <- funlist[[letter]] + 10
  funlist
}

mylist <- test(mylist,"b")

mylist
# $a
# [1] 10
# 
# $b
# [1] 15

很抱歉,但在你提出问题时回答这个问题,我不会支持你的不良做法。函数不应该在R中有副作用(这意味着:不要使用<<-)。

答案 1 :(得分:1)

您可以创建仅包含您要操作的对象的自定义环境,而不是乱用全局环境。当你更改一个你不想改变的变量时,这可以避免在轨道上引起很多问题。

这样的事情:

e <- new.env()
e$a <- 10
e$b <- 5

test <- function(letter)
{
    if(!exists(letter, e, inherits=FALSE)) stop("object ", letter, " not found")
    val <- get(letter, e) + 10
    assign(letter, val, e)
}