【问题标题】:Additional function name but with fewer arguments [duplicate]附加函数名称,但参数较少[重复]
【发布时间】:2013-04-29 08:38:51
【问题描述】:

我需要为 my_function(i,x) 创建额外的名称(其中i 可以是 1 到 25 之间的整数)。我希望它像这样工作

  • my_function1(x) 与 my_function(1,x) 相同
  • my_function2(x) 与 my_function(2,x) 相同
  • my_function3(x) 与 my_function(3,x) 相同
  • ...
  • my_function25(x) 与 my_function(25,x) 相同

实现这一目标的一种方法是:

my_function1 <- function (x) my_function(1, x)
my_function2 <- function (x) my_function(2, x)
my_function3 <- function (x) my_function(3, x)
...

但由于其中有 25 个,因此将其置于循环中是合理的。为此,我已经尝试过:

for(i in 1:25){
  assign(paste("my_function",i,sep=""),function(x) my_function(i,x))
}

但它不起作用,因为 i 是通过引用传递的,最终结果是

  • my_function1(x) 与 my_function(25,x) 相同
  • my_function2(x) 与 my_function(25,x) 相同
  • my_function3(x) 与 my_function(25,x) 相同
  • ...

如何按值传递“i”?或者也许还有其他方法……

我为什么要这样做?我正在提高其他人的 R 包的效率,但同时我需要它与旧版本兼容。

【问题讨论】:

  • 欢迎来到 SO。如果您下次发布reproducible example,您会发现您会得到更好的答案。或者这一次,因为你可以编辑你的帖子:-)
  • @AriB.Friedman 谢谢 :) 下次我会记得写可重现的例子。 Curry 看起来很干净,而且效果很好,但在这种情况下,我宁愿使用一些标准的 R 函数,因为我真的不想安装任何额外的包。

标签: r function assign


【解决方案1】:

这称为柯里化,是函数式编程的一部分。

library(functional)

myf <- function(a,x) cat(a,x,"\n")
myf1 <- Curry(myf, a=1)
myf1(5)
for(i in seq(25)) assign(paste0("myf",i), Curry(myf,a=i) )
> myf15(5)
15 5

我想这里有一个重要的问题是关于为什么你想要这样做。这似乎正是您不希望有很多相关函数的参数。

【讨论】:

  • +1 我不知道柯里化(我还有很多东西要学!)。谢谢。
  • @SimonO101 通往都柏林的道路不止一条。很好地使用bquote
  • 但是,我上面返回的内容在语法上无效!我只是从问题中复制粘贴。
【解决方案2】:

好吧,您也可以使用base 函数来获得相同的结果。

诀窍是在每次迭代时强制 (force) 评估 i,并在 .Globalenv(或您喜欢的环境)中分配您的函数

my_function <- function(a, b) a + b


lapply(1:10, function(i) {
    force(i)
    assign(paste0("my_function", i), function(x) my_function(i, x), envir = .GlobalEnv)
}
       )


my_function1(10)
## [1] 11

my_function9(10)
## [1] 19

【讨论】:

  • @SimonO101 谢谢!!!我喜欢 R 中“有不止一种方法可以做到这一点”的哲学,我也不知道 Curry 并且在这种情况下也没有考虑 bquote。谢谢
  • 有不止一种方法可以做到,但只有一种方法不这样做,我真的认为这是不应该做的事情......我打赌OP的下一个问题将是“我如何调用my_function${i}() 以获得i 的某些值?
【解决方案3】:

我认为bquote 在这里会有所帮助:

for(i in 1:2){
  assign(paste("my_function",i,sep=""), bquote( function(x) my_function( i = .(i) , x ) ) )
}

>my_function2
# function(x) my_function(i = 2L, x)

但问题仍然存在 - 你为什么想要这样做?

【讨论】:

  • 嗯,我正在提高其他人的 R 包的效率,但同时我需要它与旧版本兼容。感谢您的解决方案!
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2014-01-22
  • 2010-11-05
  • 2018-02-04
相关资源
最近更新 更多