私は非常によく似た質問が以前に尋ねられていることを知っていますが、私はそれらの古い投稿からの正確な質問に対する答えをまだ得ていません。 My機能「試験」のみデータフレームの列「COL」(.csvファイルから実際のデータ)上の「X」を実行する必要があるすなわちR:データフレーム(データフレームではない)の列のみをユーザー定義関数に送信
test <- function(x$col){...}
:
test(x$col)
私はこの構文は動作しません知っています。だから私は実行する必要があります。
test <- function(x,col){...}
:
test(x$col)
しかし、Rの機能は、本質的に非常にIN-ある関数「テスト」に渡されます、全体のデータフレームの「x」の値で渡すので、上記の問題は、あります効率的な方法、大規模な 'x'のesp!
test <- function(y){...}
:
y <- x$col
test(y)
しかし、これは良いではありません。
回避策があります。私は明白な理由がない奇妙な現象のために余分な行のコード/ベクトルを追加します!また、これは、コード内の他のどこでもその列にx$col
を使用しているため、コードの可読性が複雑になります。
私の関数 'test'の引数として 'x'と 'col'(余分な変数はありません)の組み合わせを使用して列のコピーを送信する方法がありますか?
誰かが「test」関数の引数として列を送信できない理由を提案してもらえますか?また、常にメモリに入っていない可能性があるので、毎回x$col
を使用するのは一般的に非効率ですか?
完全なデータフレームを渡してから列を抽出することが実際には非効率的であることをテスト/確認できますか? Rは、必要でない限りコピーを作成しないようにするために適度に巧妙なものをいくつか行います。これについては、http://cran.r-project.org/doc/manuals/R-ints.htmlの1.1.2セクションを参照してください。 –
data.frame全体を渡すことは非効率的ではありませんRはコピー・オン・ライトであるために見えます。 R Internalsにはより多くの情報がありますが、かなり技術的です。 http://cran.r-project.org/doc/manuals/R-ints.html#Rest-of-header。 @ PaulHiemstraの答えはあなたが探しているものだと私には思われます。 – Aaron
@BenBolker:私はあなたが正しいと信じています。私は実際に同じ参照を見つけました。私はOPと同じ考えをしていましたが、複雑な関数の1つは実際に環境を書き換えようとしましたが、データのコピーを避けると思っていました。それが全くスピードアップしなかったとき、私はRのコピーオンライトメソッドを読みました。 – Aaron