標準のdata
引数を持つ関数をRに書いています。すなわち、引数はlm
関数のようにデータフレームの名前を渡します。関数の "data"引数を扱うにはどうすればよいですか?
func(a,data=d)
となし::
func(d$a)
data
引数私はと呼ばれる機能を持っていると思います。単純化のために、関数がベクトルの平均を計算するようにしてください。どうしたらいいですか?
標準のdata
引数を持つ関数をRに書いています。すなわち、引数はlm
関数のようにデータフレームの名前を渡します。関数の "data"引数を扱うにはどうすればよいですか?
func(a,data=d)
となし::
func(d$a)
data
引数私はと呼ばれる機能を持っていると思います。単純化のために、関数がベクトルの平均を計算するようにしてください。どうしたらいいですか?
ここにいくつかの可能性があります。すべてのテストでは、組み込みのデータフレーム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)式それに接近する別の方法は、X
はdata
の列または式の環境の目的である形態~ 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
ありがとうございましたが、最初の引数に 'data'が好きではありません。実際、私の関数の最初の引数は 'glm'クラスであっても数値ベクトルであっても構いません。 (したがって 'UseMethod'は最初の引数の切り替えを行います) – Viktor
' UseMethod'にディスパッチするオブジェクトを指定することができます。 '?UseMethod'を参照してください。私は 'data'を2番目の引数にするようにこの例を修正しました。しかし、構成は少し珍しいです。 –
'func2'の定義が無効であることに注意してください。ただ試してみてください 'd = data.frame(a = 1:10); func2(a、d) ' – Viktor
データ自体は通常、データ引数に渡されます。名前は使用されません。例えば '' mtcars''ではなく '' mtcars''です。あなたは答えを得るためにいくつかのコードを表示しなければならないと思います。 –
私は[非標準評価](http://adv-r.had.co.nz/Computing-on-the-language.html)のHadleyのAdvanced Rの章を見てみることをお勧めします。それは良いことですこれを含むいくつかの例を歩いている仕事。 – r2evans
「Advanced R」の本は非常に参考になります。ありがとうございました! – Viktor