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