在函数内部,我定义了一堆标量变量,如下所示:
a <- 10
b <- a*100
c <- a + b
在函数结束时,我想在命名向量中返回a,b,c
,其名称与变量相同,编码最少,即我不想做:
c( a = a, b = b, c = c )
是否有语言结构可以做到这一点?例如,如果我只是return(c(a,b,c))
,它会返回一个未命名的向量,这不是我想要的。我目前有一种hacky方式:
> cbind(a,b,c)[1,]
a b c
10 1000 1010
是否有更好,更少hacky的方式?
答案 0 :(得分: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
请注意,不能保证生成语法上有效的名称。如果需要,请将make.names
函数应用于names
向量。
c2(mean(a,b,c))
# mean(a, b, c)
# 1
此外,与使用替代的任何函数一样,c2
更适合交互使用,而不是在另一个函数中使用。