R:从变量创建命名向量

Pra*_*ani 14 r

在函数内部,我定义了一堆标量变量,如下所示:

a <- 10
b <- a*100
c <- a + b
Run Code Online (Sandbox Code Playgroud)

在函数的结尾,我想回到a,b,c一个名为向量,具有相同的名称作为变量,用最少的代码,即我并不想这样做:

c( a = a, b = b, c = c )
Run Code Online (Sandbox Code Playgroud)

是否有语言结构可以做到这一点?例如,如果我只是这样做,return(c(a,b,c))则返回一个未命名的向量,这不是我想要的.我目前有一个hacky方式这样做:

> cbind(a,b,c)[1,]
   a    b    c 
  10 1000 1010 
Run Code Online (Sandbox Code Playgroud)

是否有更好,更少hacky的方式?

had*_*ley 13

这是为您执行此操作的功能,它还允许您选择性地命名某些值.除了获取未评估表达式并将其解析为单个字符向量的技巧之外,没有太多内容.

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 
Run Code Online (Sandbox Code Playgroud)

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

c2(mean(a,b,c))
# mean(a, b, c) 
#            1 
Run Code Online (Sandbox Code Playgroud)

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

  • 缩短了,但变得更加混乱!(我意识到没有使用列表,但是它传达了意图) (2认同)