2015-09-23 3 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 
} 
Смежные вопросы