13

私は関数出力をプロファイリングするプロジェクトに取り組んでいるので、R の引数として関数を渡す必要があります。明確にするために、さまざまな数のモデルがあり、モデルのセットアップに関する支援を求めていません。モデル関数名をスコアリング関数に追加します。

これは直接呼び出しでは機能しますが、モジュールを構築するためにより一般的なものにしたいと考えています。以下に簡単な例を示します。

#create a test function:
model1 = function(y,X){
fit = lm(y~X)
output = data.frame(resid = fit$residuals)
}

#score function:
score = function(y,X,model){
y= as.matrix(y) 
X = as.matrix(X)
fitModel = model(y,X)
yhat = y - fitModel$residual
output = data.frame(yhat=yhat)
}

有効な y および X マットを使用してこのコードを呼び出すことができます

df <- data.frame(x=rnorm(5),y=runif(5))
scoreModel1 = score(df$y,df$x,model1)

しかし、私が探しているのは、すべてのモデルをリストし、ループして、スコア関数を一般的な方法で呼び出す方法です。例えば:

models = c("model1")
scoreModel1 = score(df$y,df$x,models[1])

上記のコードで発生するエラーは

Error in score(y, X, model) : 
could not find function "model"

私は as.function() で遊んで、引数をリストおよびリストから外しましたが、何も機能しません。たとえば、次の引数はすべて上記と同じエラーを表示します

models = c(model1)
models = list(model1)
models = list("model1")

よろしくお願いいたします。

4

4 に答える 4

11

あなたのリストオブジェクトは単に直接関数にすることができます. おそらく、この構造を利用するか、Roland のアドバイスに従って式を渡すことができます。Richiemorrisroe の答えは、おそらくよりクリーンです。

fun1 <- function(x,y){
    x+y
}

fun2 <- function(x,y){
    x^y
}

fun3 <- function(x,y){
    x*y
}

models <- list(fun1 = fun1, fun2 = fun2, fun3 = fun3)

models[["fun1"]](1,2)
 [1] 3
models[[1]](1,2)
 [1] 3

lapply(models, function(FUN, x, y){ FUN(x = 1, y = 2)})
$fun1
 [1] 3

$fun2
 [1] 1

$fun3
 [1] 2
于 2012-12-26T21:34:23.383 に答える
7

match.funあなたの友だちです。これは、apply tapply他の人が同じ目的で使用しているものです。モデルフィッティング関数に引数を渡す必要がある場合は、これらすべてをそのような関数にバンドルするかfunction(x) sum(x==0, na.rm=TRUE)、リストとして提供してそのdo.callように使用する必要があることに注意してくださいdo.call(myfunc, funcargs)

お役に立てれば。

于 2012-12-26T21:31:18.213 に答える