我有一系列对象存储我工作区中某些统计模型的结果。称它们为“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。更好的是,是否有更简单的方法可以完成同样的事情?对于统计学家和模拟建模者来说,这似乎是一个常见的任务,我希望在基础包中有某种命令,但我一直找不到任何东西。当然,除了我繁琐的方法之外,必须有更优雅的方式来做到这一点。
感谢您的帮助。
- 戴夫
答案 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]]))
}
element
和object
都是字符串。
请注意,我使用了参数exact = FALSE
,因为该元素的名称为coefficients
,而不是coef
。这样,您仍然可以使用element = "coef"
。