R - Как обработать точку-точку-точку (многоточие /"...") с несколькими последующими функциями - т.е. передать только некоторые из переменных
Я работаю над нелинейной оптимизацией, с constrOptim.nl
от alabama
пакет. Однако моя проблема больше связана с передачей аргументов (и точка-точка-точка (эллипс /"...") и, возможно, 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
Функция выше - что-то вроде: "Ошибка в секунду (abc, ...): неиспользованный аргумент (zzz = " не по умолчанию ")".
Как я могу изменить minimize
а также heq
или звонок?:) Заранее спасибо
Обновление после того, как сообщение было помечено как дубликат: ответ на соответствующий пост изменяет first
функция в моем примере - так как он реализует do.call там, который вызывает другие функции. Однако я не могу изменить первую функцию в моем примере, так как хочу сохранить constrOptim.nl
работая множество различных функций. Есть ли другой способ?
1 ответ
Решение, которое я придумал, не очень элегантное, но оно работает.
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)
в конце концов, установка значений по умолчанию теперь немного неуклюжа, но неосуществима.