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) 

в конце концов, установка значений по умолчанию теперь немного неуклюжа, но неосуществима.

Другие вопросы по тегам