【问题标题】:retrieve environment values with get(ls()) in R在 R 中使用 get(ls()) 检索环境值
【发布时间】:2014-12-12 15:58:01
【问题描述】:

我想在 R 中编写一个简单的函数来解析 ls() 中的变量并获取它们的值。但是,自从我运行以下代码以来,我不确定自己做错了什么:

a <- 1
b <- 2
l <- c("a", "b")
get_val <- function(x){
  for(i in 1:length(x)){
    print(paste(x[i]))
    if(x[i] %in% ls()){
      print(paste(x[i], "value is", get(ls()[which(ls() %in% x[i])])))
    }
  }
}

get_val(l)

这只返回

> get_val(l)
[1] "a"
[1] "b"

如果我只在函数内运行for循环:

  for(i in 1:length(l)){
    print(paste(l[i]))
    if(l[i] %in% ls()){
      print(paste(l[i], "value is", get(ls()[which(ls() %in% l[i])])))
    }
  }

我猜对了

[1] "a"
[1] "a value is 1"
[1] "b"
[1] "b value is 2"

我不太确定为什么会这样,任何输入都会很棒,谢谢:)

【问题讨论】:

  • 这是因为ls() 正在返回函数本地环境中的对象。阅读?ls 中指定环境的各种方法。
  • ...还请注意,?ls 中的描述明确指出了这种行为:“在函数内不带参数调用时,ls 返回函数局部变量的名称”

标签: r environment-variables


【解决方案1】:

您在函数中的ls 查看函数的环境,而不是父环境。

试试ls([stuff], envir=.GlobalEnv

无耻插件:在包cgwtools 中查看lstypelssize 的源代码(最新版本可在my github 获得)。

【讨论】:

    【解决方案2】:

    “a”和“b”(1 和 2)的当前值确实保留在函数环境中,但没有保留值名称,因此当您调用 x[i] %in% ls() 时,名称未找到这些值。你的“如果”不被考虑

    这很有效,原因很明显

        l <- c("a", "b")
    
         get_val <- function(x){
         a <- 1
         b <- 2 
         for(i in 1:length(x)){
              print(paste(x[i]))
              if(x[i] %in% ls() ){
                   print(paste(x[i], "value is", get(ls()[which(ls() %in% x[i])])))
              }
         }
    }
    
    get_val(l)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-26
      • 2017-05-10
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多