2014-11-14 37 views
0

我想要構建一個函數,該函數接受一個變量,然後將其與函數中的其他字母連接起來以引用幀中的不同變量。例如(代碼不工作):函數採用變量名並將它們串聯在一起R

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()),但我不能完全弄清楚如何將其強制成工作的類。任何和所有的想法不勝感激。

+0

'cat'函數總是返回NULL。它的唯一影響是控制檯或文件的副作用。請閱讀幫助頁面。還請閱讀'?'$'',因爲這將不會成功使用字符參數。 – 2014-11-14 17:48:15

回答

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" 
相關問題