как передать необязательные аргументы функции внутри do.call

Я хочу программно создать массив имен переменных, например:

desired_output <- c("first_purchase_date","last_purchase_date","largest_purchase_date",
                    "first_purchase_amount","last_purchase_amount","largest_purchase_amount") 

Я считаю, что могу сделать это с do.call, опираясь на что-то вроде:

> do.call(paste, expand.grid(c("first","last","largest"),c("date","amount")))
[1] "first date"     "last date"      "largest date"   "first amount"   "last amount"    "largest amount"

Однако я не могу понять, как передать аргумент sep="_purchase_" в paste в do.call. В ?do.call я читал это

args - это список аргументов для вызова функции. Атрибут names args дает имена аргументов.

Пытаясь включить это, я пробовал:

df <- expand.grid(c("first","last","largest"), 
                  c("date","amount"), 
                  stringsAsFactors = FALSE)

do.call(paste, args = list(...=df, sep="_purchase_"))
# does not return desired output, but instead:
# [1] "c(\"first\", \"last\", \"largest\", \"first\", \"last\", \"largest\")"
# [2] "c(\"date\", \"date\", \"date\", \"amount\", \"amount\", \"amount\")"  

Как правильно производить desired_output через do.call?


person C8H10N4O2    schedule 13.04.2016    source источник
comment
Я думаю, ты хочешь do.call(paste, c(df, sep="_purchase_")).   -  person eipi10    schedule 13.04.2016
comment
Кроме того, я знаю, что это работает: mapply(paste, df$Var1, df$Var2, MoreArgs = list(sep="_purchase_"))   -  person C8H10N4O2    schedule 13.04.2016
comment
@ eipi10, который работает - если вы напишете это как ответ, я приму   -  person C8H10N4O2    schedule 13.04.2016
comment
Этот вопрос на самом деле является дубликатом хотя я, должно быть, использовал неправильные ключевые слова при поиске   -  person C8H10N4O2    schedule 13.04.2016


Ответы (1)


Вы можете сделать do.call(paste, c(df, sep="_purchase_")), но, возможно, apply(df, 1, paste, collapse="_purchase_") проще.

person eipi10    schedule 13.04.2016
comment
Я считаю полезным сравнить str(c(df, sep="_purchase_")) и str(list(df, sep="_purchase_")). Оба являются списками, но первый находится в плоской структуре, которую ожидает paste(), а не во вложенной структуре, которую создает последний. - person C8H10N4O2; 13.04.2016