Мне трудно научиться использовать eval() для оценки функции,
предположим, у меня есть функция:
sq <- function(y){ y**2 }
вы можете оценить эту функцию следующим образом:
call <- match.call(expand.dots = FALSE)
call[[1]] <- as.name('sq')
call$y <- 0.2
call <- call[c(1,3)]
eval(call)
и это даст и 0,2 ^ 2 = 0,04
Но если я хочу вычислить что-то вроде sq(y), где y = sin(x), я могу написать:
call <- match.call(expand.dots = FALSE)
call[[1]] <- as.name('sq')
call$y <- as.name('sin')
call$x <- 0.2
call <- call[c(1,3:4)]
eval(call)
это даст мне эту ошибку:
Error in sq(y = sin, x = 0.2) : unused argument (x = 0.2)
Кажется, что R не может распознать x как аргумент sin, а вместо этого является аргументом sq. как мы можем сказать R, что x является аргументом греха?
Кроме того, кажется, что R - единственный язык, который я изучил, который использует eval() для оценки функции (я знаю C++ и Python, но раньше не видел этот синтаксис), в чем отличие (или преимущество) для оценки функции в таким образом вместо вызова sq(y=sin(x=0.2))?
Есть ли хорошая книга или учебник, рассказывающий о его использовании и о том, когда использовать между двумя способами? Спасибо!
PS: приведенный выше пример на самом деле представляет собой упрощенную версию кода в пакете mlogit, который я изучаю, в котором вероятность журнала возвращается путем вызова «lnl.slogit», передается в «mlogit.optim» и оптимизируется (строка 407 из https://github.com/cran/mlogit/blob/master/R/mlogit.R). Я использовал тот же метод, что и код в пакете, для вызова двух функций, но получил указанную выше ошибку.