附加函数名称但参数较少

时间:2013-05-05 12:10:06

标签: r function assign

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

3 个答案:

答案 0 :(得分:6)

这称为currying,是函数式编程的一部分。

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 :(得分: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

答案 2 :(得分: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)

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