【问题标题】:R: Pass a function of many parameters as one of one parameter to another function by setting its other parametersR:通过设置其他参数将具有多个参数的函数作为一个参数之一传递给另一个函数
【发布时间】:2015-02-10 09:37:29
【问题描述】:

一般问题: 我有一个函数,它接受另一个函数作为参数,形式为:

F <- function(x, FUN){FUN(x)}

我可以很容易地向它传递一个简单的函数:

f1 <- function(x){plot(x, 1/x)}
F(-5:5, f1)

将显示 1/x 的图。

假设我有另一个更复杂的功能:

f2 <- function(x, a){plot(x, 1/x^a)}

f2 有 2 个参数,因此不能直接传递给 F。但我可能希望保留 a 的灵活性,这样,在不定义许多不同功能的情况下,我可以快速绘制 1/x^a 以获得我喜欢的任何值。我试过了,a = 2:

F(-5:5, f2(, 2))
F(-5:5, f2(, a=2))
F(-5:5, f2(x, 2))
F(-5:5, f2(a=2))

但这些都不起作用。有没有人有办法解决吗? (我可以在f2 中为a 设置默认值,但是我无法使用不同的a 值运行它。

具体上下文: 我有一个函数,它将找到一个函数的逆拉普拉斯变换,将一个函数作为它的参数,该函数预期有一个参数(拉普拉斯变量,p)。我可以反转上面f1 之类的函数。但我正在尝试反转地下水中污染物运输的功能。这个过程取决于许多其他参数,例如水流速度和行进距离。所以我希望能够传递一个用于拉普拉斯反演的多参数函数,使得除了拉普拉斯参数 p 之外的所有参数都是固定的。最终,我想使用不同的速度值等多次执行此过程,因此我需要一种流畅的方式来更改正在使用的“固定”参数。

提前感谢您的帮助, 克里斯托弗

【问题讨论】:

  • 看看?dotsMethods 和?do.call。将两者结合起来应该会给你一个解决方案。
  • 用省略号F &lt;- function(x, FUN, ...){FUN(x, ...)}; F(-5:5, f2, a=4)怎么样?
  • 咖喱是要走的路。

标签: r function arguments


【解决方案1】:

只需定义一个函数生成器:

genFunc = function(a)
{
    function(x) plot(x, 1/x^a)
}

F(-5:5, genFunc(2))

或使用 functional 包中的 Curry 来修复您想要的参数并为您的膳食调味:

library(functional)
F(-5:5, Curry(f2, a=2))

【讨论】:

  • 谢谢博维尔上校。两种解决方案都简单有效。
  • 没问题,Curry 层次更高,让你写的代码更少:)
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2011-03-09
相关资源
最近更新 更多