自动将变量名称添加到列表的元素

时间:2014-01-09 04:36:49

标签: string r

我有一个模型列表,并且为了使代码更容易维护(对添加和删除模型如此粗略)我想在一个地方存储它们和它们的名称。为此,我必须解决以下命名问题。

上游,我已经以比以下效率更低的方式生成模型(如果这是压缩的,我会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 ...)样板。

3 个答案:

答案 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)

sapplysimplify=FALSE一起使用。这将为结果指定名称。

sapply(lmNms, get, simplify=FALSE)