【问题标题】:Shadow variable in RR中的阴影变量
【发布时间】:2013-06-15 17:15:01
【问题描述】:

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

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

通常情况下,我会使用

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

这可能吗?

【问题讨论】:

    标签: r variables scope variable-assignment


    【解决方案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)
    }
    

    【讨论】:

    • 啊,现在更有意义了。由于显而易见的原因,我对使用全球环境持怀疑态度,好吧,这似乎是一个糟糕的主意。但是,使用它会使事情变得更整洁!非常感谢!
    【解决方案2】:

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

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

    【讨论】:

    • 感谢你拯救了他的灵魂!
    • 谢谢。虽然我知道使用全局范围并不是最好的主意,但我对 R 还是很陌生,不知道我可以为此目的创建自定义环境。
    • 特别是对于初学者来说,重要的是要了解列表通常是要走的路。它为一些强大的工具开辟了道路,例如lapply 和亲戚。通常你不应该使用getassign,直到你更高级。如果可能,应避免使用 eval/parse 构造。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多