引数の 1 つが適用する関数を示す関数を作成する方法はありますか?
たとえば、関数がある場合:
mf = function(data, option, level)
データセットのを計算するかmean
、median
またはを計算するかを示すオプションが必要ですか?sd
引数の 1 つが適用する関数を示す関数を作成する方法はありますか?
たとえば、関数がある場合:
mf = function(data, option, level)
データセットのを計算するかmean
、median
またはを計算するかを示すオプションが必要ですか?sd
はい、1 つのオプションは、単に関数を に渡すことoption
です。例えば
mf <- function(data, option) {
option <- match.fun(option)
option(data)
}
set.seed(42)
dat <- rnorm(10)
mf(dat, option = mean)
これにより、次のことが得られます。
> set.seed(42)
> dat <- rnorm(10)
> mean(dat)
[1] 0.5472968
> mf(dat, option = mean)
[1] 0.5472968
> sd(dat)
[1] 0.8354488
> mf(dat, option = sd)
[1] 0.8354488
match.fun()
利用可能な関数に一致する標準的な R の方法です。この例では、関数自体を渡しmatch.fun()
ますが、文字列など、関数を参照する他の方法を使用できます。
> mf(dat, option = "mean")
[1] 0.5472968
match.fun()
他の関数として使用できる関数を返します。したがって、引数option()
に渡された関数と本質的に同じ関数であるか、引数で指定された関数です。option
option
level
引数がどのように使用されることになっていたかは明確ではありません。上記ではそれを無視しました。
適用された関数に引数を渡したい場合...
は、関数定義で使用することをお勧めします。たとえば、次のようになります。
mf <- function(data, option, ...) {
option <- match.fun(option)
option(data, ...)
}
したがって、このようなことができます
set.seed(42)
dat2 <- rnorm(10)
dat2[4] <- NA
mean(dat2)
mean(dat2, na.rm = TRUE)
mf(dat2, mean, na.rm = TRUE)
与える最後の3行
> mean(dat2)
[1] NA
> mean(dat2, na.rm = TRUE)
[1] 0.5377895
> mf(dat2, mean, na.rm = TRUE)
[1] 0.5377895
R の「データセット」は通常データフレームを意味し、median.data.frame がないため、lapply と do.call の両方を使用する必要があるという点で少し問題があります。
df <- data.frame(x=rnorm(10), y=rnorm(10))
mf = function(data, option="mean") {lapply( data,
function(col) do.call(option, list(col))) }
mf(df)
#-------------
$x
[1] 0.01646814
$y
[1] 0.5388518
あなたは「レベル」が何をするべきかを示していなかったので、私はそれを方程式から除外しました.
> mf(df, sd)
$x
[1] 1.169847
$y
[1] 0.8907117