我有一个模型列表,并且为了使代码更容易维护(对添加和删除模型如此粗略)我想在一个地方存储它们和它们的名称。为此,我必须解决以下命名问题。
上游,我已经以比以下效率更低的方式生成模型(如果这是压缩的,我会assign
他们自己的env
)。
lmNms <- c( "mod1", "mod2", "mod3", "mod4", "mod5", "mod6")
lapply(lmNms, function(N) assign(N, lm(runif(10) ~ rnorm(10)), env = .GlobalEnv))
下游,我把这个烂摊子收集到一个清单中:
modelList <- list(mod1, mod2, mod3, mod4, mod5, mod6)
我有一个(未命名的)变量输出列表,并按如下方式附加名称:
output <- list(1, 2, 3, 4, 5, 6)
names(output) <- lmNms
我希望能够使用modelList
中的模型名称:
modelList <- list(mod1, mod2, mod3, mod4, mod5, mod6)
names(output) <- someFun(modelList)
我确信存在someFun
- 但我无法理解......这可以吗?
要明确的是,目标是使用lmNms
>> - 我希望从modelList
获取名称,或者让它们在此处附加我构建modelList
(重点是避免list(a = a, b=b ...)
样板。
答案 0 :(得分:5)
关键是当你不提供名字时重新使列表功能粘在名字上。
listN <- function(...){
anonList <- list(...)
names(anonList) <- as.character(substitute(list(...)))[-1]
anonList
}
使用此功能,您可以按如下方式进行modelList
:
modelList <- listN(mod1, mod2, mod3, mod4, mod5, mod6)
附上姓名:
R> names(modelList)
[1] "mod1" "mod2" "mod3" "mod4" "mod5" "mod6"
给出了一个更全面的解决方案here,这对使用list
的匿名参数和命名参数的混合非常有用。
listN2 <- function(...){
dots <- list(...)
inferred <- sapply(substitute(list(...)), function(x) deparse(x)[1])[-1]
if(is.null(names(inferred))){
names(dots) <- inferred
} else {
names(dots)[names(inferred) == ""] <- inferred[names(inferred) == ""]
}
dots
}
答案 1 :(得分:1)
您可以在环境中执行此操作:
e <- new.env()
output <- list(1,2,3,4,5,6)
nms <- c( "mod1", "mod2", "mod3", "mod4", "mod5", "mod6")
for(i in 1:length(output)) {
nm <- nms[i]
e[[nm]] <- output[[i]]
}
您可以像任何列表一样引用环境中的项目,或将其强制转换为列表
> ls(e)
[1] "mod1" "mod2" "mod3" "mod4" "mod5" "mod6"
> e[['mod1']]
[1] 1
> e$mod1
[1] 1
> new_output <- as.list(e)
由于环境的行为很像列表,因此可能还有一种简单的方法可以使用原始列表。
答案 2 :(得分:1)
将sapply
与simplify=FALSE
一起使用。这将为结果指定名称。
sapply(lmNms, get, simplify=FALSE)