Перемещение исходного кода в отдельный файл изменяет значение, возвращаемое методом

Я пишу определение класса, которое будет очень длинным, и я хотел бы получить код для методов из отдельных файлов. В большинстве случаев это работает, но я столкнулся с чем-то странным при попытке вернуть 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.

1 ответ

Как предложил 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
Другие вопросы по тегам