Можете ли вы включить функцию R, чтобы увидеть значения своих формалей при оценке?
В языке R предположим, что у меня есть функция ff(jj, kk, mm). Я хотел бы, чтобы вызывающая функция (или вызывающий человек в интерактивном сеансе) могла сделать мм произвольным образом зависящим от jj и kk во время вызова.
Для конкретности предположим:
ff <- function(jj, kk, mm){
xx <- jj + kk
out<- xx/mm
out
}
Затем во время выполнения я хочу установить mm <- jj*kk
, то есть:
ff(2, 3, (jj*kk))
это дает:
Error in ff(2, 3, (jj * kk)) : object 'jj' not found
Эта ошибка не выдается, пока mm
оценивается, т.е. после jj
а также kk
уже были оценены успешно. Таким образом, они затем оцениваются во второй раз с другими правилами определения объема. Я понимаю, что это R-стандартная область видимости. Я спрашиваю, могу ли я написать функцию таким образом, чтобы она позволяла мне передать мм простое число, или функцию других формальных аргументов, при условии, что эти аргументы были или могут быть оценены раньше mm
необходимо?
Обратите внимание, что я не спрашиваю, должен ли я сделать это. Я буду честно притворяться вежливым по отношению к людям, которые высказывают мнения по этому последнему вопросу.
Также я не спрашиваю, могу ли я предварительно рассчитать jj и передать предварительно усвоенное число. Я знаю, что это правдоподобный ответ, но он не работает по причинам, которые я упростила из проблемы.
1 ответ
Как оно есть, ваша функция ff()
не работает, потому что предоставленные аргументы оцениваются в контексте вызывающей среды, с какой точки зрения ни jj
ни kk
"видны".
Чтобы оценить заявление, представленное mm
в контексте собственной структуры оценки функции используйте eval(substitute())
, вот так:
ff <- function(jj, kk, mm){
mm <- eval(substitute(mm))
xx <- jj + kk
out<- xx/mm
out
}
ff(2, 3, (jj*kk))
## [1] 0.8333333