2017-04-10 10 views
0

非常に長いクラス定義を作成しています。別のファイルからメソッドのコードをソースにしたいと思います。ほとんどの場合、うまくいくようですが、data.frameを返そうとすると何か不思議なことに遭遇しました。コードがクラス定義に直接書き込まれると、data.frameは正常に戻ります。それがソースである場合、返されるのは長さ2のリストで、最初の要素(value)にはdata.frameが含まれ、2番目の要素(visible)にはアトミック論理TRUEが含まれます。 メソッドのコードを別のファイルに残したまま、data.frameだけを返すメソッドを取得するにはどうすればよいですか?ここソースコードを別のファイルに移動すると、メソッドによって返された値が変更されます

メインファイルである:

#getFrame2.R 

MyData = private$Frame 
return(MyData) 

注二つの方法のためのコードはまったく同じであること:ここ

#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() 

方法ソースファイルです。コードはdownloaded from githubです。

+2

これは、 'ソースは()'使用されることを意味しているか、実際にはありません。現在の作業ディレクトリがこれらの2つのファイルが置かれている場所と異なる場合、これも非常に複雑になります。代わりに、複数のファイルに関連するコードを配布するために、Rで適切なパッケージを作成してください。または、少なくとも、ソースとなるファイルに適切な関数を置き、ファイルの先頭にソースを入れて、コード内で適切なオブジェクトとして使用します。 – MrFlick

+0

また、 'return'は関数の最後に戻るために使われることを意図しています。ソースファイルのトップレベルでそれを使うのは意味がありません。 – Dason

+0

@MrFlick - 関数が、クラスインスタンスのプライベートメンバーと自己メンバーとメソッドを参照するメソッドであることを意図している場合は動作しますか? –

答えて

0

MrFlick suggestedとして、これを簡単に実行するには、メソッドで行う処理を行う関数を定義し、メソッドをその関数の呼び出しとして定義し、クラスインスタンスの必須メンバーをパラメータとして渡す。

関数の定義:

#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 
関連する問題