возврат функции в качестве другого параметра функции с eval () в R - PullRequest
0 голосов
/ 16 мая 2018

Мне сложно научиться использовать 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 как аргумент греха, но вместо этого аргумент 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). Я использовал тот же метод, что и код в пакете, для вызова двух функций, но я получил ошибку выше.

1 Ответ

0 голосов
/ 16 мая 2018

Код пытается передать:

  • аргумент x в sq, но sq не имеет x аргумента
  • функции sin варгумент y но требуется число, а не функция.

Попробуйте это:

x <- 0.2
cl <- call("sq", y = quote(sin(x)))

cl
## sq(y = sin(x))

eval(cl)
## [1] 0.0394695

или, возможно, вам нужно:

x <- 0.2
cl <- call("sq", y = sin(x))

cl
## sq(y = 0.198669330795061)

eval(cl)
## [1] 0.0394695

или

match.fun("sq")(sin(x))
## [1] 0.0394695

или просто:

sq(sin(x))
## [1] 0.0394695

Обратите внимание, что обычно вам не нужно использовать eval.Достаточно перечислить функцию с ее аргументами, чтобы оценить ее как последнюю строку кода.

Функции регрессии в R внутренне используют нестандартный код из-за соображений, связанных с окружением, но обычно это не требуетсяв других контекстах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...