5

我需要为 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 包的效率,但同时我需要它与旧版本兼容。

4

3 回答 3

6

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

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

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

于 2013-05-05T12:12:32.890 回答
4

好吧,您也可以使用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
于 2013-05-05T13:11:00.573 回答
2

我认为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)

但问题仍然存在——你为什么要这样做

于 2013-05-05T13:07:47.667 回答