R - 如何跨相同类型的多个对象提取相同命名元素的值?

时间:2012-09-25 17:44:34

标签: r

我有一系列对象存储我工作区中某些统计模型的结果。称它们为“model1”,“model2”等。每个模型都附有相同的命名元素集,例如$ coef。我想从包含字符串“model”的所有对象中提取存储在特定元素中的值的列表或向量。

在命令行输入的以下代码可以实现我的目的:

unlist(lapply(parse(text = paste0(ls()[grep("model", ls() )], "$", "coef")), eval))

由此,我创建了以下通用函数:

get.elements <- function(object, element) {
    unlist(lapply(parse(text = paste0(ls()[grep(object, ls() )], "$", element)), eval))
}

但是,当我运行此函数时,我收到以下错误:

Error in parse(text = paste0(ls()[grep(object, ls() )], "$", element)) : 
  <text>:1:1: unexpected '$'
1: $
   ^

Q1。为什么这个代码在从命令行运行时起作用而不是作为一个函数运行,更重要的是,我该如何修复它?

Q2。更好的是,是否有更简单的方法可以完成同样的事情?对于统计学家和模拟建模者来说,这似乎是一个常见的任务,我希望在基础包中有某种命令,但我一直找不到任何东西。当然,除了我繁琐的方法之外,必须有更优雅的方式来做到这一点。

感谢您的帮助。

- 戴夫

3 个答案:

答案 0 :(得分:12)

Q1)代码失败,因为ls()在函数的环境中查找,因为那里没有匹配的对象,

paste0(ls()[grep(object, ls() )], "$", element)

相当于

paste0("$", element)

要让ls()查看您的工作区,您需要ls(pos = 1)

Q2)这是一项常见的任务,但据我所知,没有一个函数可以执行此操作,因为模型的位置,调用内容,要提取的对象以及返回的方式取决于根据您的要求。你上面提出的一个稍微简洁的版本就是

nm <- paste0("model", 1:2) # adjust numbers as required
unlist(lapply(nm, function(x) get(nm)$coef))

或者,您可以将模型放在列表中并使用

modList <- list(model1, model2)
unlist(lapply(modList, "[[", "coefficients"))

答案 1 :(得分:3)

您可以使用purrr package中的地图。

l1 <- list(a1 = 3, a2 = 2)
l2 <- list(a1 = 334, a2 = 34)
l3 <- list(a1 = 90, a2 = 112)

l <- list(l1, l2, l3)

purrr::map(l, "a1")

这给出了:

### Result
[[1]]
[1] 3

[[2]]
[1] 334

[[3]]
[1] 90

答案 2 :(得分:2)

这是获得所需输出的一种方法:

get.elements <- function(object, element) {
 unlist(lapply(ls(pattern = object, .GlobalEnv),
        function(x) get(x, .GlobalEnv)[[element, exact = FALSE]]))
}

elementobject都是字符串。

请注意,我使用了参数exact = FALSE,因为该元素的名称为coefficients,而不是coef。这样,您仍然可以使用element = "coef"