gpt4 book ai didi

引用类、制表符补全和强制方法定义

转载 作者:行者123 更新时间:2023-12-02 01:42:51 24 4
gpt4 key购买 nike

我目前正在使用引用类编写一个包。我遇到过阅读各种来源的问题:

Method initialisation in R reference classes

Can't reliably use RefClass methods in Snowfall

我收集是因为引用方法没有全部复制到每个对象造成的在类中,而不是在第一次访问时复制它们。

https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html

作为示例定义:

test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
}
)
)

example <- test$new()

所以 example 是类 TEST 的一个新对象。输入 example$ 并按 Tab 键控制台给出

> example$
# example$.->a example$.refClassDef example$.self
# example$a example$initialize

因此方法 addone 不会作为选项出现。它可用于但是请调用:

example$addone()

现在再次按 Tab 键即可显示

# > 
# > example
# Reference class object of class "TEST"
# Field "a":
# [1] 2
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$field
# example$initialize example$show

所以现在 addonefieldshow 作为选项呈现。

Martin Morgan 建议在上述链接之一中强制定义方法。这效果很好

test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
.self$addone #force definition
}
)
)

example <- test$new()

现在 Tab 键给出:

# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$initialize

我的一些类有超过 30 个方法,所以我想尽可能简洁地做到这一点。我已经定义:

test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
eval(parse(text=paste0('.self$',ls(test$def@refMethods))))
}
)
)

example <- test$new()

现在按 Tab 键可以显示:

# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$callSuper
# example$copy example$export example$field
# example$getClass example$getRefClass example$import
# example$initFields example$initialize example$show
# example$trace example$untrace

虽然这有效,但感觉有点笨拙。另外,使用 test$def@refMethods 而不是 getRefClass("TEST")$def@refMethods ,这样感觉有点不对劲。以前有人处理过这个问题吗?

有没有更好的方法来解决问题?感谢您的任何建议,如果问题过于冗长,我们深表歉意。

最佳答案

我想知道你的目标是什么?函数名称显示带有制表符补全吗?那么就值得在 R-devel 邮件列表中发帖提出功能请求。使用 usingMethods 可以更优雅地处理原始场景,如 ?setRefClass 中所述。持续的黑客攻击可能是

initialize = function(...) {
methods <- getRefClass(class(.self))$methods()
eval(parse(text=paste0(".self$", methods)))
callSuper(...)
}

制表符补全可以通过 utils 包中的 .DollarNames 进行自定义,因此

.DollarNames.TEST <- function(x, pattern)
grep(pattern, getRefClass(class(x))$methods(), value=TRUE)

也许可以在类层次结构的基础上为此编写 S3 方法?

关于引用类、制表符补全和强制方法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com