来自R中的单个对象的多功能输入?

时间:2019-03-15 15:36:19

标签: 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 个答案:

答案 0 :(得分:3)

使用基数R,您可以使用do.call建立调用并创建要传递给函数的参数list()

do.call("fxn", c(list(df$yes), unname(df[bar])))

这与

相同
fxn(df$yes, df[bar][[1]], df[bar][[2]])

我们需要使用unname(),因为否则您的函数期望“ y”和“ z”时,您的参数将分别命名为“ no”和“ maybe”。

您可以使用rlang

library(rlang)
eval_tidy(quo(fxn(df$yes, !!!unname(df[bar]))))

与其他一些语言一样,它使用!!!拼接操作符。 Base R没有这样的语法。