【问题标题】:R output named listR输出命名列表
【发布时间】:2020-02-06 18:24:06
【问题描述】:

我经常编写将命名列表作为参数返回的函数。这是一个简单的例子:

func <- function() {
    x <- rnorm(10)
    y <- runif(10)
    out <- list(x = x, y = y)
    return(out)
}

命令list(x = x, y = y) 是我当前的解决方案,它使列表的名称与其包含的对象相同,否则输出将具有名称[[1]][[2]]。我的问题是,对于更长和更复杂的示例,这可能会变得烦人且相当不雅。

我想知道是否有更好的解决方案,不需要我写两次列出的每个元素的名称。我看到了一个类似的问题here,但发现被接受了回答对我来说太复杂了。

【问题讨论】:

  • func &lt;- function() list(x=rnorm(10), y=runif(10))
  • @jogo 感谢您的意见;我想我应该提到我知道这个替代方案,但是如果列表元素更复杂(想象长方程或大数据框)它也可能看起来很丑,更不用说可能有理由保留@ 987654327@ 和 y 分配并位于函数的早期部分。

标签: r list names


【解决方案1】:

1) data.frame 对于问题中的函数,这可以输出名称为xy 的命名列表。没有使用任何包。

func <- function() {
    x <- rnorm(10)
    y <- runif(10)
    as.list(data.frame(x, y))
}

2) mget 如果xy 的长度相同,则上述方法有效,但即使不是,此方法也有效。同样,没有使用任何包。这将输出func2 中所有变量的命名列表,但我们可以使用 mget(c("x", "y")) 如果我们想要排除 func2 中的其他变量。

func2 <- function() {
    x <- rnorm(10)
    y <- runif(10)
    mget(ls())
}

虽然这些习语在实践中消除了两次(甚至根本没有)列出xy,但我认为list(x = x, y = y) 可能更清楚。

【讨论】:

  • 我喜欢这个解决方案;我实际上使用mget(ls()) 来获取一些函数来将所有创建的对象转储到输出中,但不知何故我从未想过将它用于这个确切的目的。谢谢!
【解决方案2】:

您可以使用tibble::lst,它也适用于不等数量的元素

func <- function() {
  x <- rnorm(3)
  y <- runif(2)
  out <- tibble::lst(x, y)
  return(out)
}

func()

# $x
#  [1]  0.04829009 -0.14348606  0.18524324
# 
# $y
#  [1] 0.1486643 0.5511159

【讨论】:

    【解决方案3】:

    你可以使用eapply:

    func <- function() {
        x <- rnorm(10)
        y <- runif(10)
        eapply(.GlobalEnv, I)[c("x","y")] 
    }
    

    sapplyget

    func <- function() {
        x <- rnorm(10)
        y <- runif(10)
        sapply(c("x","y"), get, simplify = FALSE)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多