【问题标题】:Automatically add variable names to elements of a list [duplicate]自动将变量名称添加到列表的元素[重复]
【发布时间】:2014-01-09 04:36:49
【问题描述】:

我有一个模型列表,并且为了使代码更易于维护(因此难以添加和删除模型),我希望有一个单独的位置来存储它们及其名称。为此,我必须解决以下命名问题。

在上游,我生成模型的效率低于以下方法(如果它是这样压缩的,我会将 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获取名称,或者在我构建@时附加它们987654331@(重点是避免list(a = a, b=b ...)样板。

【问题讨论】:

  • 在创建模型期间,这个问题的一个好的解决方案很可能位于代码的更上游。如果我试图在自己的代码中解决这个问题,我会首先避免通过list(mod1, mod2, mod3, mod4, mod5, mod6) 创建模型列表。但是如果没有更多细节,很难说你会怎么做。
  • 改变这个方面是一项艰巨的工作——所以我最好不要......
  • 你能举个例子mod1,mod2,etc...
  • 它们是大型模型输出对象。与各种回归函数的输出类型相似。关键是我想命名一个列表的元素。

标签: string r


【解决方案1】:

这样做的关键是,当您不提供名称时,重新制作列表功能以粘贴名称。

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
}

【讨论】:

    【解决方案2】:

    你可以在环境中做到这一点:

    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)
    

    由于环境的行为很像列表,因此可能也有一种简单的方法可以使用您的原始列表来实现。

    【讨论】:

    • hmm ...一个有希望的线索——但我的问题是我想摆脱对象nms,并使用modelList命名output的元素。跨度>
    【解决方案3】:

    sapplysimplify=FALSE 一起使用。这将为结果分配名称。

    sapply(lmNms, get, simplify=FALSE)
    

    【讨论】:

    • 我意识到这似乎很懒惰,但目的是避免使用lmNms。如果我这样做R&gt; sapply(c(mod1, mod2), get, simplify = F),我会收到以下错误:Error in FUN(X[[1L]], ...) : invalid first argument
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2021-09-27
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多