2017-11-21 10 views
1

Rを理解していれば、オブジェクトをメモリに一時的にコピーするということです。グローバル環境内のオブジェクトが大きすぎてコピーできても、コードを単純化するために関数を使用するにはどうすればよいですか?または、機能を操作するために大きなオブジェクトの必要な部分だけをサブセット化することをお勧めしますか?オブジェクトのコピーではなくグローバル環境でオブジェクトを使うことをr関数に要求する

# load two objects with 10 million rows and 500 columns 
big.object.1 <- readRDS(file = "previously.created.dataframe.1") 
big.object.2 <- readRDS(file = "previously.created.dataframe.2") 

# method 1 with memory use of ~xMB? 
big.object.1$recoded.column <- ifelse(big.object.1$old.column > 0, 
             big.object.1$recoded.column * 2, 
             big.object.1$recoded.column * 0.5) 

# method 2 with memory use of ~2xMB? 
new.column_function <- function(data, old.col, recoded.col) { 
    data[recoded.col] <- ifelse(data[old.col] > 0, 
           data[recoded.col] * 2, 
           data[recoded.col] * 0.5) 
} 

new.column_function(data = big.object.1, 
        recoded.col = 400, 
        new.col = 401) 

コードが機能せずに複雑ですが、メモリが機能を持つ問題であるベストプラクティスは何ですか?大きなオブジェクトのコピーを避けるにはどうすればよいですか?

+3

メモリがあなたのdata.frame.':= =で問題になったときに 'data.table'を試してみて、カラムのサブセットを参照によって素早く追加、削除、更新することができます。 – myincas

+0

@ incas56、答えとして簡単な例を挙げられますか? data.frameをdata.tableに変換してから、上記のようにdata.tableを操作することもできますか?ありがとう。 – jtd

答えて

0

あなたは

new.column_function <- function(old.col, recoded.col) { 

    ind <- big.object[old.col] > 0 

    # Do this 
    big.object[recoded.col] <<- ifelse(ind, big.object[recoded.col][ind] * 2, 
             big.object[recoded.col][ind] * 0.5) 

    # OR do this 
    big.object[recoded.col][ind] <<- big.object[recoded.col][ind] * 2 
    big.object[recoded.col][!ind] <<- big.object[recoded.col][!ind] * 0.5 

    # Don't think this behaves in the intended way... 
    #   ifelse(big.object[old.col] > 0, 
    #        big.object[recoded.col] * 2, 
    #        big.object[recoded.col] * 0.5) 
} 

これはdata.tableを使用するよりも優れている場合、私は知らない<<-(代わりの<-)を使用して関数内で、地球環境のオブジェクトにアクセスすることができます。

+0

私はbig.object.1とbig.object.2を持っていると仮定します。したがって、私はどのオブジェクト(例:function(big.object、old.col、recoded.col))を指定するための関数パラメータが必要だと思います。 _これは、私がnew.column_function(big.object.2、400、401)を呼び出し、<<のための関数の中でassignment_を使うと、これは依然としてbig.object.2のコピーを作らないでしょうか? big.object.1には1つの関数を、big.object.2には2つ目の関数を提案していますか? – jtd

+0

'new.column_function(big.object.2、400、401)'は 'big.object.2'のコピーを作成します。 ** ifelse **は間違っています。 – Suren

+0

あなたは 'ifelse'を使った方法に問題があると思います。編集した解決策の1つを試してみてください。 – Suren

0

あなたはnameOfDataは、例えば値big.object.1を持つ文字列である。この場合には、オブジェクト全体に

new.column_function <- function(nameOfData, old.col, recoded.col) { 
    get(nameOfData)[recoded.col] <- ifelse(data[old.col] > 0, 
           data[recoded.col] * 2, 
           data[recoded.col] * 0.5) 
} 

を関数にobjektの名前を付けていないだけに機能getassignを試してみて、使用することができます

関連する問題