0

我正在编写一个非常长的类定义,并且我想从单独的文件中获取方法的代码。大多数时候,这似乎有效,但我在尝试返回 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)

请注意,这两种方法的代码完全相同。代码可以从 github 下载

4

1 回答 1

0

正如MrFlick 所建议的那样,实现这一点的简单方法是定义一个函数来执行您希望该方法执行的操作,然后将该方法定义为对该函数的调用,将类实例的所需成员作为参数传递。

函数定义:

#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
于 2017-04-11T12:22:37.067 回答