#r
#r
Вопрос:
Я хотел бы использовать один объект для передачи нескольких входных данных функции в R, возможно ли это? MWE:
df <- data.frame(yes = c(10,20), no = c(50,60),maybe = c(100,200))
fxn <- function(x,y,z){
a = x y
b = x z
c = y z
return(list(a=a,b=b,c=c))
}
foo <- c("rincon","malibu","steamer")
bar <- c("no","maybe")
df[foo] <- fxn(df$yes,df[bar])
В реальной проблеме моя функция имеет больше входных данных, для которых по умолчанию установлено значение NULL
. Я работаю в динамическом блестящем контексте, поэтому значение и длина bar
меняются. Любая помощь для этого новичка была бы высоко оценена.
Комментарии:
1. Вы можете создать список аргументов для передачи функции с помощью
alist()
. Это то, что вы ищете?
Ответ №1:
С помощью base R вы можете построить вызов, используя do.call
и создать list()
параметры, которые вы хотите передать функции
do.call("fxn", c(list(df$yes), unname(df[bar])))
Это было бы то же самое, что
fxn(df$yes, df[bar][[1]], df[bar][[2]])
Нам нужно использовать unname()
, потому что в противном случае ваши параметры были бы названы «no» и «maybe», в то время как ваша функция ожидает «y» и «z».
rlang
Пакет, вы могли бы сделать
library(rlang)
eval_tidy(quo(fxn(df$yes, !!!unname(df[bar]))))
Который использует !!!
оператор объединения, как и в некоторых других языках. Базовый R не имеет такого синтаксиса.