2015-09-23 43 views
1

我想將列名的名稱作爲變量傳遞給函數。 具體地,給出以下代碼:用R中的字符串值替換變量

#------------------------------------------ 
# Create mock data 
#------------------------------------------ 

DF1 = data.frame(colA = as.Date("2015-09-21") + 0:4, B = 1:5, C = 5:1) 
DF2 = data.frame(B = 1:5, C = 5:1) 

#------------------------------------------ 
# Sample function call 
#------------------------------------------ 

colname <- "colA" 

b_func <- function(my_dt1, my_dt2, my_col) {  
    return(eval(substitute(cbind(variable = as.Date("2015-09-21") + 0:4, DF2), 
    list(variable = as.name(my_col))))) 
} 

b_func(DF1, DF2, colname) 

我希望得到以下的輸出:

 colA B C 
1 2015-09-21 1 5 
2 2015-09-22 2 4 
3 2015-09-23 3 3 
4 2015-09-24 4 2 
5 2015-09-25 5 1 

相反,我得到下面的輸出,其中,代替"colA"我得到"variable"

variable B C 
1 2015-09-21 1 5 
2 2015-09-22 2 4 
3 2015-09-23 3 3 
4 2015-09-24 4 2 
5 2015-09-25 5 1 

進一步挖掘我發現:

colname <- "colA" 
substitute(cbind(variable = as.Date("2015-09-21") + 0:4, DF2), list(variable = as.name(colname))) 
# returns: cbind(variable = as.Date("2015-09-21") + 0:4, DF2) 
# expected: cbind(colA = as.Date("2015-09-21") + 0:4, DF2) 

這個例子是總部設在R FAQ的文件上,但我無法使它工作。一個解決方案和簡短的解釋將不勝感激。

在此先感謝。

+1

'setNames()'會(cbind後'()') –

+0

謝謝理查德一個更安全的路線。優秀的建議。 – Stan

回答

2

substitute不能替代參數名稱,它們不是變量。

您可以使用do.call代替:

b_func <- function (my_dt1, my_dt2, my_col) 
    do.call(cbind, setNames(c(list(as.Date("2015-09-21") + 0:4), DF2), 
          c(my_col, colnames(DF2)))) 

但是理查德在他的評論點:您可以通過cbind後,簡化了這個荷蘭國際集團第一,並指定名稱:

b_func <- function (my_dt1, my_dt2, my_col) 
    setNames(cbind(as.Date("2015-09-21") + 0:4, DF2), c(my_col, colnames(DF2))) 
1

我m困惑於你的函數my_dt1和my_dt2的兩個參數似乎沒有被使用。你似乎在做的是向DF2添加一列?如果是這樣,只是這樣做:

b_func = function(my_dt, my_col) { 
    my_dt[[my_col]] = as.Date("2015-09-21") + 0:4 
    my_dt 
}