是否可以更改R6功能的值?(好的OOP编程风格?) 我来自C++背景,试图用R6软件包进行rOOP编程。 当编写一个大的OOP代码时,考虑下面的典型情况。 您有一个类,其中有几个(可能很多)函数,每个函数都可能非常复杂,并且有许多代码行: # file CTest.R cTest <- R6Class( "CTest", public = list( z = 10, fDo1 = function() { # very long and complex code goes here self$z <- self$z*2; self$z }, fDo2 = function() { # another very long and complex code goes here print(self) } ) ) #"CTest"

是否可以更改R6功能的值?(好的OOP编程风格?) 我来自C++背景,试图用R6软件包进行rOOP编程。 当编写一个大的OOP代码时,考虑下面的典型情况。 您有一个类,其中有几个(可能很多)函数,每个函数都可能非常复杂,并且有许多代码行: # file CTest.R cTest <- R6Class( "CTest", public = list( z = 10, fDo1 = function() { # very long and complex code goes here self$z <- self$z*2; self$z }, fDo2 = function() { # another very long and complex code goes here print(self) } ) ) #"CTest",r,function,oop,closures,r6,R,Function,Oop,Closures,R6,现在我测试它是否有效: > tt <- cTest$new(); tt; tt$fDo1(); tt <CTest> Public: clone: function (deep = FALSE) fDo1: function () fDo2: function () z: 10 [1] 20 <CTest> Public: clone: function (deep = FALSE) fDo1: function () fDo2: function

现在我测试它是否有效:

> tt <- cTest$new(); tt; tt$fDo1(); tt
<CTest>
Public:
clone: function (deep = FALSE) 
fDo1: function () 
fDo2: function () 
z: 10
[1] 20
<CTest>
Public:
clone: function (deep = FALSE) 
fDo1: function () 
fDo2: function () 
z: 20

>tt多亏了格罗森迪克的上述评论,我们有了一个合理的解决方案来让它发挥作用

与此相反:

# CTest-Do1_doesnotwork.R
cTest$fDo1 <- function() { 
    ... 
}     
这段代码现在可以按照最初的需要编写在单独的文件中

我仍然想知道——上面描述的方法实际上是R社区中编写大型OOP代码的常见(最佳)实践吗?(我觉得有点奇怪)。

如果不是,那是什么(除了使用
source()
)?-那么,要为类的各个部分(功能)启用协作编码和源代码控制

我来这里也是为了寻找R6的最佳实践。我看到()的一种方法是将其他地方的函数定义为普通的R函数,并根据需要传入self、private等

cTest<- R6::R6Class("CTest",
  public = list(

  fDo1 = function()
    cTestfDo1(self),

  fDo2 = function(x)
    cTestfDo2(self, private, x)
))
“代码> CtStEnter”如果你在C++(java等)中编程,通常的编程方法是:首先,你在.h文件中声明函数,然后为每个复杂函数创建C文件,在那里定义函数“-这实际上不适用于java。一种语言有单独的头文件和实现文件实际上并不常见
# CTest-Do1_works.R  
cTest$set(
  overwrite = TRUE, "public", "fDo1",    
  function() {  
      ...
  }
)
cTest<- R6::R6Class("CTest",
  public = list(

  fDo1 = function()
    cTestfDo1(self),

  fDo2 = function(x)
    cTestfDo2(self, private, x)
))
cTestfDo1 <- function(self) {
  self$z <- self$z*2; self$z
}
cTestfDo2 <- function(self, private, x) {
  self$z * private$q + x
}