【问题标题】:How to pass a list of arguments to partially match a function's parameters?如何传递参数列表以部分匹配函数的参数?
【发布时间】:2017-11-03 06:07:03
【问题描述】:

我想传递一个列表来部分匹配函数的参数。我在这里寻找与do.call 方法等效的简单语法:Passing list of named parameters to function?

这是一个示例(取自https://stackoverflow.com/a/15059219/2109289),其中调用mapply(FUN, ...) 需要将数据框列一一传递给...

> df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
> df
  x y z
1 1 3 5
2 2 4 6
> mapply(function(x,y) x+y, df$x, df$z)
[1] 6 8

如果您可以将数据框df[, c("x", "z")] 作为参数传递不是很好吗?

例如:

df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
do.call(function(x, y) mapply(function(x,y) x+y, x, y), unname(df[, c("x", "z")]))
# [1] 6 8
do.call(function(...) mapply(function(x,y) x+y, list(...)[[1]], list(...)[[2]]), df[, c("x", "z")])
# [1] 6 8

有没有更好的方法来代替创建要传递给do.call 的闭包?

【问题讨论】:

    标签: r


    【解决方案1】:

    一个选项是

    unlist(do.call(Map, c(f = `+`, df[c('x', 'z')])))
    #[1] 6 8
    

    或使用mapply

    do.call(mapply, c(FUN = `+`, df[c('x', 'z')]))
    #[1] 6 8
    

    【讨论】:

    • do.call("+", df[, c("x", "z")])
    • @baptiste 或Reduce('+', df[c('x', 'z')])
    • 谢谢,看起来很有用,但我不确定这将如何支持更通用的功能。即,对于一般函数 f &lt;- function(x1, x2, x3, ...),可以像 f(x1, x2, arg_list) 一样调用它。
    • @Alex fFUN 将函数作为参数。所以,我不知道这里有什么问题。
    • 我的问题是要在函数中使用列表,要么为每个函数参数显式调用列表的每个元素,要么创建一个完整的函数参数列表,然后传递给do.call (你的第二个解决方案)。我想知道是否有一个中间立场,您不必这样做。
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2021-09-26
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多