0

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

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

通常,我会使用

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就会更新。

这可能吗?

4

2 回答 2

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 中不应该有副作用(这意味着:不要使用<<-)。

于 2013-06-19T08:50:10.790 回答
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)
}
于 2013-06-19T09:16:09.967 回答