R - 如何使用多个后续函数处理点-点-点(省略号/“...”) - 即仅传递一些变量
R - How to handle the dot-dot-dot (ellipis/"...") with multiple subsequent functions - i.e. passing only some of the variables
我正在使用 alabama
包中的 constrOptim.nl
进行非线性优化。但是,我的问题更多地与传递参数(和点-点-点(省略号/“...”)和可能 do.call
)有关 - 所以我首先给出一个一般示例,然后参考 constrOptim.nl
函数。
假设我有以下功能 - 我只能从中编辑 second
和 third
但 不能 first
。
first<-function (abc, second, third, ...){
second(abc,...)
third(abc,...)
}
second<- function(abc, ttt='nothing special'){
print(abc)
print(ttt)
}
third<- function(abc, zzz="default"){
print(abc)
print(zzz)
}
我想要的输出与我 运行
时得到的输出相同
second("test", ttt='something special')
third("test", zzz="non-default")
这是
"test"
"something special"
"test"
"non-default"
但是,下面的代码无法执行此操作。
first("test",second=second, third=third, ttt='something special',zzz="non-default")
如何更改调用或 second
和 third
函数以使其正常工作?
http://www.r-bloggers.com/r-three-dots-ellipsis/
在这里,我找到了一些 do.call
可以帮助我的建议,但目前我无法理解它应该如何工作。
我无法更改 first
函数,因为这是我的特定问题中的 constrOptim.nl
- 它被设计为能够传递更多参数到不同的功能。但是,我可以更改 second
和 third
函数 - 因为它们是我想要最小化的限制和函数。显然我也可以改变函数的调用。
所以更具体地说,这是我的具体问题:
我执行非线性限制的最大似然估计:
minimize <- function(Param,VARresiduals){
#Blahblah
for (index in 1:nrow(VARreisduals)){
#Likelihood Blahbla
}
return(LogL)
}
heq<-function(Param,W){
B<-Param[1:16]
restriction[1]<-Lrestriction%*%(diag(4)%x%(solve(W))%*%as.vector(B))
restriction[2:6]<-#BlablaMoreRestrictions
return(restriction)
}
现在我调用 constrOptim.nl
...
constrOptim.nl(par=rnorm(20), fn=minimize,hin=NULL heq=heq,VARresiduals,W)
...但是得到同样的错误,就像我在调用上面的 first
函数时收到的一样 - 类似于:"Error in second(abc, ...) : unused argument (zzz = "non-default")".
如何更改 minimize
和 heq
或呼叫? :) 提前致谢
在 post 被标记为重复后 Update:
相关 post 的答案更改了我的示例中的 first
函数 - 因为它在那里实现了 do.call,调用了其他函数。但是,我无法更改示例中的第一个函数,因为我想让 constrOptim.nl
继续使用各种不同的函数。还有别的办法吗?
我想出的解决方案不是很优雅,但很有效。
second_2<- function(abc, extras){
a<-extras[[1]]
print(abc)
print(a)
}
third_2<- function(abc, extras){
a<-extras[[2]]
print(abc)
print(a)
}
extras<-list()
extras[[1]]<-'something special'
extras[[2]]<-"non-default"
extras
first("test",second=second_2, third=third_2, extras)
令人惊讶的是,以下代码也有效,但结果略有不同
first("test",second=second, third=third, extras)
毕竟,现在设置默认值有点笨拙,但并非不可行。
我正在使用 alabama
包中的 constrOptim.nl
进行非线性优化。但是,我的问题更多地与传递参数(和点-点-点(省略号/“...”)和可能 do.call
)有关 - 所以我首先给出一个一般示例,然后参考 constrOptim.nl
函数。
假设我有以下功能 - 我只能从中编辑 second
和 third
但 不能 first
。
first<-function (abc, second, third, ...){
second(abc,...)
third(abc,...)
}
second<- function(abc, ttt='nothing special'){
print(abc)
print(ttt)
}
third<- function(abc, zzz="default"){
print(abc)
print(zzz)
}
我想要的输出与我 运行
时得到的输出相同second("test", ttt='something special')
third("test", zzz="non-default")
这是
"test"
"something special"
"test"
"non-default"
但是,下面的代码无法执行此操作。
first("test",second=second, third=third, ttt='something special',zzz="non-default")
如何更改调用或 second
和 third
函数以使其正常工作?
http://www.r-bloggers.com/r-three-dots-ellipsis/
在这里,我找到了一些 do.call
可以帮助我的建议,但目前我无法理解它应该如何工作。
我无法更改 first
函数,因为这是我的特定问题中的 constrOptim.nl
- 它被设计为能够传递更多参数到不同的功能。但是,我可以更改 second
和 third
函数 - 因为它们是我想要最小化的限制和函数。显然我也可以改变函数的调用。
所以更具体地说,这是我的具体问题: 我执行非线性限制的最大似然估计:
minimize <- function(Param,VARresiduals){
#Blahblah
for (index in 1:nrow(VARreisduals)){
#Likelihood Blahbla
}
return(LogL)
}
heq<-function(Param,W){
B<-Param[1:16]
restriction[1]<-Lrestriction%*%(diag(4)%x%(solve(W))%*%as.vector(B))
restriction[2:6]<-#BlablaMoreRestrictions
return(restriction)
}
现在我调用 constrOptim.nl
...
constrOptim.nl(par=rnorm(20), fn=minimize,hin=NULL heq=heq,VARresiduals,W)
...但是得到同样的错误,就像我在调用上面的 first
函数时收到的一样 - 类似于:"Error in second(abc, ...) : unused argument (zzz = "non-default")".
如何更改 minimize
和 heq
或呼叫? :) 提前致谢
Update:
相关 post 的答案更改了我的示例中的 first
函数 - 因为它在那里实现了 do.call,调用了其他函数。但是,我无法更改示例中的第一个函数,因为我想让 constrOptim.nl
继续使用各种不同的函数。还有别的办法吗?
我想出的解决方案不是很优雅,但很有效。
second_2<- function(abc, extras){
a<-extras[[1]]
print(abc)
print(a)
}
third_2<- function(abc, extras){
a<-extras[[2]]
print(abc)
print(a)
}
extras<-list()
extras[[1]]<-'something special'
extras[[2]]<-"non-default"
extras
first("test",second=second_2, third=third_2, extras)
令人惊讶的是,以下代码也有效,但结果略有不同
first("test",second=second, third=third, extras)
毕竟,现在设置默认值有点笨拙,但并非不可行。