在R中,我想創建一個類(R6Class),它在調用initialize時會創建很少的動態方法(方法的數量及其名稱取決於參數在初始化)。但是我遇到了一些與環境有關的奇怪問題在R6Class中創建動態方法,打印的魔力(ls.str())
這是一個不起作用的簡化版代碼。
library(R6)
ffactory <- function(i) {
function() i
}
A <- R6Class(
lock_objects=FALSE,
public=list(
initialize=function(args) {
for (i in args) {
self[[i]] <- ffactory(i)
}
}
)
)
a <- A$new(c('a', 'b', 'c'))
現在:
> a$a()
[1] "c"
> a$b()
[1] "c"
> a$c()
[1] "c"
爲了找到什麼是錯的我補充說,在ffactory函數打印環境的線路。那就是
ffactory <- function(i) {
print(ls.str())
function() i
}
現在它已經開始工作了!
> a$a()
[1] "a"
> a$b()
[1] "b"
> a$c()
[1] "c"
那麼爲什麼?應該有一些我不明白的東西。觀察者效應還是什麼? :)
行print(ls.str())
的魔法是什麼?其實我無法從這一行刪除print
或str
。有一條這樣的線路當然很愚蠢。更不用說屏幕上的垃圾了。
呵呵呵。非常感謝!有趣的是,懶惰的參數'i'在惰性評估函數'function()i'內,它是一個非惰性評估函數。 – Bartek
當然,如果它解決了您的問題,請隨時接受我的答案。 – nrussell