2017-02-26 3 views
0

標準のdata引数を持つ関数をRに書いています。すなわち、引数はlm関数のようにデータフレームの名前を渡します。関数の "data"引数を扱うにはどうすればよいですか?

func(a,data=d) 

となし::

func(d$a) 

data引数私はと呼ばれる機能を持っていると思います。単純化のために、関数がベクトルの平均を計算するようにしてください。どうしたらいいですか?

+1

データ自体は通常、データ引数に渡されます。名前は使用されません。例えば ​​'' mtcars''ではなく '' mtcars''です。あなたは答えを得るためにいくつかのコードを表示しなければならないと思います。 –

+0

私は[非標準評価](http://adv-r.had.co.nz/Computing-on-the-language.html)のHadleyのAdvanced Rの章を見てみることをお勧めします。それは良いことですこれを含むいくつかの例を歩いている仕事。 – r2evans

+0

「Advanced R」の本は非常に参考になります。ありがとうございました! – Viktor

答えて

1

ここにいくつかの可能性があります。すべてのテストでは、組み込みのデータフレームBODが使用されます。

1)S3あなたはdata.frameとデフォルトメソッドを持つジェネリックS3を書き込むことができます。

func1 <- function(x, data) UseMethod("func", if (missing(data)) x else data) 
func1.data.frame <- function(x, data) mean(data[[x]]) 
func1.default <- mean 

# test 

func1("Time", BOD) 
## [1] 3.666667 

func1(BOD$Time) 
## [1] 3.666667 

2)上記は少し珍しいですし、あなただけの場合を使用することを好む可能性がある場合:

func2 <- function(x, data) if (missing(data)) mean(x) else mean(data[[x]]) 

func2("Time", BOD) 
## [1] 3.666667 

func2(BOD$Time) 
## [1] 3.666667 

3)非標準の評価、これは一般的に推奨されていませんが、あなたはまた、非標準的な評価を使用することができ

func3 <- function(x, data) { 
    if (missing(data)) 
     mean(x) 
    else 
     eval(substitute(mean(x)), data) 
} 

func3(Time, BOD) 
## [1] 3.666667 

func3(BOD$Time) 
## [1] 3.666667 

4)式それに接近する別の方法は、Xdataの列または式の環境の目的である形態~ Xでなければならない数式を使用することです。 dataが省略された場合は、デフォルトで呼び出し元の環境になります。つまり、最初にdataを検索し、が見つからない場合は、が見つかりました。数式の環境を調べます。

func4 <- function(x, ...) UseMethod("func4") 
func4.formula <- function(x, data = parent.frame()) { 
     p <- parse(text = all.vars(x)) 
     e <- eval(p, data, environment(x)) 
     mean(e) 
} 
func4.default <- mean 

func4(~Time, BOD) 
## [1] 3.666667 

v <- BOD$Time 
func4(~v) 
## [1] 3.666667 

func4(BOD$Time) 
## [1] 3.666667 
+0

ありがとうございましたが、最初の引数に 'data'が好きではありません。実際、私の関数の最初の引数は 'glm'クラスであっても数値ベクトルであっても構いません。 (したがって 'UseMethod'は最初の引数の切り替えを行います) – Viktor

+0

' UseMethod'にディスパッチするオブジェクトを指定することができます。 '?UseMethod'を参照してください。私は 'data'を2番目の引数にするようにこの例を修正しました。しかし、構成は少し珍しいです。 –

+0

'func2'の定義が無効であることに注意してください。ただ試してみてください 'd = data.frame(a = 1:10); func2(a、d) ' – Viktor

関連する問題