Мне нужно использовать eval
для вызова метода эталонного класса. Ниже пример игрушки:
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
нужен для оценки методов, а не полей? - почему
.self
больше не нужен после того, как он был использован один раз?
hello
изp
с помощьюp$hello
перед вызовомp$run("hello()")
также позволяет последнему выполняться без ошибок.p$hello
изменяет окружениеp$run
. Вы можете увидеть это сp <- MyClass$new(); ls(environment(p$run)); p$hello; ls(environment(p$run))
- person Matthew Plourde   schedule 03.07.2013