Несколько функциональных входов от одного объекта в R?

#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 не имеет такого синтаксиса.