Мне нужно использовать метод eval
, чтобы вызвать метод ссылочного класса. Ниже приведен пример игрушки:Как избежать добавления. При использовании eval в ссылочном классе в R?
MyClass <- setRefClass("MyClass",
fields = c("my_field"),
methods = list(
initialize = function(){
my_field <<- 3
},
hello = function(){
"hello"
},
run = function(user_defined_text){
eval(parse(text = user_defined_text))
}
)
)
p <- MyClass$new()
p$run("hello()") # Error: could not find function "hello" - doesn't work
p$run(".self$hello()") # "hello" - it works
p$run("hello()") # "hello" - now it works?!
p <- MyClass$new()
p$run("my_field") # 3 - no need to add .self
Я предполагаю, что я мог сделать eval(parse(text = paste0(".self$", user_defined_text)))
, но я не очень понимаю:
- почему
.self
нужно Eval методов, но не поле? - Почему
.self
больше не нужен после того, как он был использован один раз?
Это похоже на ошибку или, по крайней мере, нежелательное поведение. Обратите внимание, что просто вызывать 'hello' из' p' с 'p $ hello' перед вызовом' p $ run («hello()») также позволяет последнему выполнить без ошибки. 'p $ hello' изменяет среду' p $ run'. Вы можете увидеть это с помощью 'p <- MyClass $ new(); LS (среда (р $ ход)); р $ привет; ls (среда (p $ run)) ' –
@MatthewPlourde Я узнал, что это не ошибка, она предназначена для ленивой оценки для повышения производительности. Несколько полезных ресурсов для других, сталкивающихся с этой проблемой: [R-devel] (https://stat.ethz.ch/pipermail/r-devel/2011-June/061260.html), stackoverflow [вопрос] (http://stackoverflow.com/questions/12543166/reference-classes-tab-completion-and-forced-method-definition?rq=1) – nachocab