R 将源代码移动到单独的文件会更改方法返回的值

R 将源代码移动到单独的文件会更改方法返回的值,r,r6,R,R6,我正在编写一个非常长的类定义,我想从单独的文件中获取方法的代码。大多数情况下,这似乎是可行的,但我在尝试返回data.frame时遇到了一些奇怪的情况。当代码直接写入类定义中时,data.frame返回良好。当它是源代码时,返回的是长度为2的列表,其中第一个元素(名为value)包含data.frame,第二个元素(名为visible)包含原子逻辑TRUE如何让方法只返回data.frame,而将方法的代码保留在单独的文件中? 以下是主文件: #MainScript.R library(R6)

我正在编写一个非常长的类定义,我想从单独的文件中获取方法的代码。大多数情况下,这似乎是可行的,但我在尝试返回data.frame时遇到了一些奇怪的情况。当代码直接写入类定义中时,data.frame返回良好。当它是源代码时,返回的是长度为2的列表,其中第一个元素(名为
value
)包含data.frame,第二个元素(名为
visible
)包含原子逻辑
TRUE
如何让方法只返回data.frame,而将方法的代码保留在单独的文件中?

以下是主文件:

#MainScript.R
library(R6)

MyClass = R6Class(
  classname = "myclass",
  private = list(Frame = NA),
  public = list(
    initialize = function(){},
    setFrame = function(x){private$Frame = x},
    getFrame = function(){
      MyData = private$Frame
      return(MyData)
    },
    getFrame2 = function(){source("getFrame2.R", local = T)}
  )
)


data1 = data.frame(v1 = rnorm(5,1,2), v2 = rnorm(5,1,2))

current = MyClass$new()
current$setFrame(data1)
current$getFrame()
current$getFrame2()
以下是方法源文件:

#getFrame2.R

MyData = private$Frame
return(MyData)
请注意,这两个方法的代码完全相同。代码可以是。

因为,实现这一点的简单方法是定义一个函数,该函数执行您希望该方法执行的操作,然后将该方法定义为对该函数的调用,并将类实例所需的成员作为参数传递

函数定义:

#getFrame3.R
getFrame3 = function(Frame){
  MyData = Frame
  return(MyData)
}
主文件:

#MainScript3.R
library(R6)
source("getFrame3.R")

MyClass = R6Class(
  classname = "myclass",
  private = list(Frame = NA),
  public = list(
    initialize = function(){},
    setFrame = function(x){private$Frame = x},
    getFrame = function(){
      MyData = private$Frame
      return(MyData)
    },
    getFrame2 = function(){source("getFrame2.R", local = T)},
    getFrame3 = function(){return(getFrame3(private$Frame))}
  )
)

data1 = data.frame(v1 = rnorm(5,1,2), v2 = rnorm(5,1,2))

current = MyClass$new()
current$setFrame(data1)
current$getFrame() #works with code in the class definition
current$getFrame2() #doesn't work
current$getFrame3() #works with function call

这并不是
source()
的真正用途。如果您当前的工作目录与这两个文件所在的位置不同,这也会变得非常复杂。取而代之的是在R中创建一个合适的包,以便在多个文件中分发相关代码。或者至少将适当的函数放在您要查找的文件中,并在文件顶部找到它们,然后在代码中将它们作为适当的对象使用。而且
return
仅用于在函数末尾返回-在源文件的顶层使用它没有意义。@MrFlick-如果函数应该是引用类实例的私有和自成员以及方法的方法?只需定义一个函数,将私有数据作为参数,并从类定义中调用它。@Dason-这样做是因为寻找整个方法定义似乎不起作用。
return
语句是包含在方法(函数)定义中的代码的末尾,因此它确实在方法(函数)的末尾执行。