【问题标题】:Apply a multi-variable function to a vector in R将多变量函数应用于 R 中的向量
【发布时间】:2017-01-18 00:18:52
【问题描述】:

我想定义任意数量的变量的任意函数,例如,对于 2 个变量:

func2 <- function(time, temp) time + temp

我想保留对问题有意义的变量名(上面的时间和温度)。

如果我有这些变量的值向量,例如在二维情况下,c(10, 121),我想应用我的函数(此处为 func2)并获得结果。从概念上讲,类似于,

func2(c(10,121))

变成

func2(10,121)

对于任意数量的变量,是否有一种简单的方法来完成此操作?

谢谢

【问题讨论】:

  • 你来自像 python 这样支持 splatting 的语言吗?调用函数时拆分向量真的有问题吗?从技术上讲,您可以使用 do.call 之类的东西来执行此操作,但在 R 中它会变得非常混乱。除非绝对必要,否则我可能不会推荐它。
  • 你能把它指定为命名向量吗?例如,func2(c(time=10, temp=121)).
  • 我试图重现的是 Mathematica 中经常使用的东西。在 Mathematica 中,像 c(10,121) 这样的表达式将有一个名为 List 的“头”。该头可以用带有“应用”的函数名称替换。 (在多维数组中的任何级别)。下面的答案很有用,但我的最终目标更复杂。我想制作一个多维版本的“外部”。像 my.outer(func, a_vec, b_vec, c_vec, ..) 一样,变量“a”、“b”、“c”等的函数将应用于来自向量外积的向量每个变量的值。
  • 我想使用 expand.grid (确实需要重塑输出)。还是有点小问题。
  • 这似乎不太奏效:apply(expand.grid(temps,times), 1, function(a) do.call(func2, as.list(a))) 虽然这做:do.call(func2, as.list(c(10, 121)))

标签: r function vector apply


【解决方案1】:

您可以编写一个辅助函数,借助do.call 将简单的向量转换为参数

splat <- function(f,v) {
    do.call(f, as.list(v))
}

splat(func2, c(10,121))

【讨论】:

  • 也许返回一个闭包以消除在每次调用时指定 func2 的需要?
  • 这也是个好主意。只是不想在此示例中创建另一个需要担心的变量。
  • 谢谢。 do.call 和 as.list 将完成这项工作。我已经阅读了足够多的内容,几乎可以弄清楚这一点,但并不完全。再次感谢。
【解决方案2】:

这是你要找的吗?

f = function(f,...) {
  v = list(...)
  Reduce(f, v)
}

> f(f = "+", x = pi, y = exp(1), z = pi^2)
15.72948

【讨论】:

  • 我认为这与我尝试做的有点不同。我认为上面的答案有我遗漏的部分。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多