gpt4 book ai didi

r - 将函数动态添加到 r6 类实例

转载 作者:行者123 更新时间:2023-12-04 10:37:38 24 4
gpt4 key购买 nike

我试图忘记引用类(R5)并移至 R6,但动态代码存在问题。我会添加一个新功能,它适用于 R5:

clsTrn <- setRefClass("clsTrn",
fields = list(x = "numeric"),
methods = list(
add_function = function(rcode) {
eval(parse(text=rcode), envir=.self)
}
)
)

cls <- clsTrn$new(x=4)
cls$x
# [1] 4
cls$add_function("predict = function(y) {return(.self$x*y)}")

cls$predict(3)
#[1] 12

类似的代码不适用于 R6。

library(R6)

clsTrnR6 <- R6Class("clsTrnR6",
lock=FALSE,
public = list(
x = NA,
initialize = function(x) {
self$x <- x
},
add_function = function(rcode) {
eval(parse(text=rcode), envir=self)
}
)
)


clsR6 <- clsTrnR6$new(x=4)
clsR6$x
#[1] 4

clsR6$add_function("predict = function(y) {return(self$x*y)}")
# Błąd weval(expr, envir, enclos) : nie udało się znaleźć funkcji '='
clsR6$predict(3)

在类定义中添加 predict 没有任何改变,同样的错误。
有什么解决办法吗?提前致谢。

> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=pl_PL.UTF-8 LC_NUMERIC=C LC_TIME=pl_PL.UTF-8 LC_COLLATE=pl_PL.UTF-8 LC_MONETARY=pl_PL.UTF-8
[6] LC_MESSAGES=pl_PL.UTF-8 LC_PAPER=pl_PL.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=pl_PL.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] R6_2.0

loaded via a namespace (and not attached):
[1] codetools_0.2-8 rpart_4.1-5 tools_3.1.1
>

补充:在@G.Grothendieck 很好的回答之后,我有了基于字符串的函数定义,但也许有更优雅的解决方案。

library(R6)

clsTrnR6 <- R6Class("clsTrnR6",
lock=FALSE,
public = list(
x = NA,
initialize = function(x) {
self$x <- x
},
add_function = function(name, meth) {
self[[name]] <- meth
environment(self[[name]]) <- environment(self$add_function)
},
add_function2 = function(name, meth) {
eval(parse(text=paste0("predict <- ",meth)))
self[[name]] <- predict
environment(self[[name]]) <- environment(self$add_function)
}
)
)

clsR6 <- clsTrnR6$new(x=4)
clsR6$x

#[1] 4

clsR6$add_function2("predict", "function(y) y*self$x")
clsR6$predict(11)

#[1] 44

最佳答案

您可以使用 $set() method在生成器对象上。因此,您将更改类定义而不是对象。

clsTrnR6$set("public", "predict", function(y) self$x*y)
clsR6 <- clsTrnR6$new(x=4)
clsR6$predict(3)
[1] 12

编辑:

更改类定义意味着在使用 $set 修饰符之前创建的对象将没有 predict功能。

关于r - 将函数动态添加到 r6 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331030/

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