带有变量名称并在R中串行连接它们的函数

时间:2014-11-14 17:42:49

标签: r function naming paste

我想构建一个函数,它接受一个变量,然后将它与函数中的其他字母连接起来,以引用框架中的不同变量。例如(代码不起作用):

set.seed(123)
frame <- data.frame(x = rnorm(100), p01u = rnorm(100), p01o = rnorm(100))

sum.fun <- function(frame, var){
        xu <-  cat(paste(var, "u", sep = ""))
        xo <-  cat(paste(var, "o", sep = ""))
        print(sum(frame$xu))
        print(sum(frame$xo))
}

sum.fun(frame, "p01")

这里的问题出现在cat(paste()),但我无法弄清楚如何将其强制转化为有效的类。任何和所有的想法都非常感激。

1 个答案:

答案 0 :(得分:2)

您可以移除cat来电并使用[[来获取列,因为$不适用于字符参数。

sum.fun <- function(frame, var) {
    xu <-  paste0(var, "u")
    xo <-  paste0(var, "o")
    setNames(c(sum(frame[[xu]]), sum(frame[[xo]])), c(xu, xo))
}

sum.fun(frame, "p01")
#      p01u      p01o 
# -10.75468  12.04651 

检查:

with(frame, c(sum(p01u), sum(p01o)))
# [1] -10.75468  12.04651

注意:如果您想要一个函数的多个输出,我认为最好使用list作为输出。这样,你就可以得到一个字符向量和一个数字向量,它们都被归类为结果中所需的。例如:

sum.fun2 <- function(frame, var){
    xu <-  paste0(var, "u")
    xo <-  paste0(var, "o")
    list(names = c(xu, xo), values = c(sum(frame[[xu]]), sum(frame[[xo]])))
}

(sf2 <- sum.fun2(frame, "p01"))
# $names
# [1] "p01u" "p01o"
#
# $values
# [1] -10.75468  12.04651
sapply(sf2, class)
#       names      values 
# "character"   "numeric"