我需要为my_function(i,x)创建其他名称(其中i
可以是1到25之间的整数)。我希望它像这样工作
实现这一目标的一种方法是:
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
是通过引用传递的,最后结果是
我如何通过值传递“i”?或许还有其他方式...
为什么我要这样做?我在效率方面正在改进别人的R包,但与此同时我需要它与旧版本兼容。
答案 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)
但问题仍然存在 - 为什么你想要这样做?