Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 附加函数名,但参数较少_R_Function_Assign - Fatal编程技术网

R 附加函数名,但参数较少

R 附加函数名,但参数较少,r,function,assign,R,Function,Assign,我需要为我的_函数(I,x)创建附加名称(其中I可以是1到25之间的整数)。我希望它能像这样工作 我的_函数1(x)与我的_函数(1,x)相同 我的_函数2(x)与我的_函数(2,x)相同 我的_函数3(x)与我的_函数(3,x)相同 我的_函数25(x)与我的_函数(25,x)相同 实现这一目标的一种方法是: my_function1 <- function (x) my_function(1, x) my_function2 <- function (x) my_funct

我需要为我的_函数(I,x)创建附加名称(其中
I
可以是1到25之间的整数)。我希望它能像这样工作

  • 我的_函数1(x)与我的_函数(1,x)相同
  • 我的_函数2(x)与我的_函数(2,x)相同
  • 我的_函数3(x)与我的_函数(3,x)相同
  • 我的_函数25(x)与我的_函数(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)
...
但是它不起作用,因为
i
是通过引用传递的,结果是

  • 我的_函数1(x)与我的_函数(25,x)相同
  • 我的_函数2(x)与我的_函数(25,x)相同
  • 我的_函数3(x)与我的_函数(25,x)相同
如何通过值传递“I”?或者也许还有别的方法


我为什么要这么做?在效率方面,我正在改进其他人的R软件包,但同时我需要它与旧版本兼容。

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

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
库(功能性)

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

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

好吧,您也可以使用
base
函数来实现相同的结果

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


my_函数欢迎使用SO。如果你下次发帖子,你会发现你会得到更好的答案。或者这次,因为你可以编辑你的帖子:-)@AriB.Friedman谢谢:)下次我会记得写一个可复制的例子。咖喱看起来很干净,工作也很完美,但在这种情况下,我宁愿使用一些标准的R函数,因为我真的不想安装任何额外的软件包。谢谢。@SimonO101去都柏林的路不止一条。很好地使用了
bquote
。但是,我上面返回的内容在语法上是无效的!我只是从问题中复制粘贴。@SimonO101谢谢!!!我喜欢R中的“不止一种方法”哲学,我也不知道
Curry
,在这种情况下也没有想到
bquote
。有不止一种方法可以做到,但只有一种方法不能做到,我真的认为这是不应该做的事情。。。我打赌OP的下一个问题将是“我如何调用
myu函数${I}()
来获取
I
的某些值?好吧,我正在改进其他人的R包的效率,但同时我需要它与旧版本兼容。谢谢你的解决方案!
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)
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