9

我的工作区中有一系列对象存储一些统计模型的结果。称它们为“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。更好的是,有没有更简单的方法可以完成同样的事情?对于统计学家和模拟建模师来说,这似乎是一项常见的任务,我希望基本包中有某种命令,但我一直找不到任何东西。肯定有比我笨重的方法更优雅的方法来做到这一点。

感谢所有帮助。

——戴夫

4

3 回答 3

13

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"))
于 2012-09-25T18:11:12.590 回答
4

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

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
于 2016-10-12T20:59:52.533 回答
2

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

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

element和都是object字符串。

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

于 2012-09-25T18:03:32.343 回答