【问题标题】:R: creating a named vector from variablesR:从变量创建命名向量
【发布时间】:2011-02-18 14:58:50
【问题描述】:

在一个函数中,我定义了一堆这样的标量变量:

a <- 10
b <- a*100
c <- a + b

在函数结束时,我想在一个命名向量中返回a,b,c,与变量同名,编码最少,即我 em> 想做的事:

c( a = a, b = b, c = c )

有这样的语言结构吗?例如,如果我只是简单地执行return(c(a,b,c)),它会返回一个未命名的向量,这不是我想要的。我目前有一种 hacky 方法:

> cbind(a,b,c)[1,]
   a    b    c 
  10 1000 1010 

有没有更好、更简单的方法?

【问题讨论】:

  • 还有什么比 c(a=a,b=b,c=c) 更小?您必须在某处指定名称和值。或者你想让它神奇地意识到'a'被称为'a'?
  • 是的,这就是我想要的——例如上面的cbind 做到了这一点,我对它的简约性非常满意,但我想知道是否有更直接的方法。变量名可能很长......我想节省打字时间:)
  • 你想节省打字,但是你混淆了你的代码(如果我看到这样的结构,我会尽快把它从代码中取出来),并且在处理 big and/or 时你会失去相当多的性能很多向量。我真的会再想一想,您是否没有找到可以以不同方式解决的问题的解决方案。
  • 您为什么要在函数中节省打字时间?你只写一次。我鼓励您转而关注执行速度和清晰度。
  • @Joshua 我总体上同意你的看法。我只是对cbind() 保留变量名而c() 没有这一事实感到困扰,所以我正在检查是否有一种简单的方法可以实现这一点。

标签: r


【解决方案1】:

这里有一个函数可以帮你做这件事,它还允许你选择命名一些值。除了获取未评估的表达式并将其分解为单个字符向量的技巧之外,它并没有什么大不了的。

c2 <- function(...) {
  vals <- c(...)

  if (is.null(names(vals))) {
    missing_names <- rep(TRUE, length(vals))
  } else {
    missing_names <- names(vals) == ""
  }
  if (any(missing_names)) {
    names <- vapply(substitute(list(...))[-1], deparse, character(1))
    names(vals)[missing_names] <- names[missing_names]
  }

  vals
}

a <- 1
b <- 2
c <- 3

c2(a, b, d = c)
# a b d 
# 1 2 3 

请注意,不能保证生成语法上有效的名称。如果需要,请将make.names 函数应用于names 向量。

c2(mean(a,b,c))
# mean(a, b, c) 
#            1 

此外,与任何使用替代的函数一样,c2 更适合交互使用,而不是在另一个函数中使用。

【讨论】:

  • @hadley: substitute(list(...))[-1] 可以缩写为 substitute(...())
  • 缩短了,但更令人困惑! (我意识到没有使用列表,但它传达了意图)
  • @hadley:我在my kimisc package 中添加了两个函数ncnlist,感谢您和这个答案。
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2014-09-02
  • 2012-07-10
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多