3

crrstep-function('crrstep'パッケージ)にいくつかの引数を渡したい関数を書いていますが、問題が発生しました。crrstepに入力すると、関数の引数'event'が認識されません。crrstepは、私が見たい環境とは異なる環境に見えると思いますが、Webでソリューションを何時間も検索した後でも、これを解決する方法がわからないようです(プログラミングの経験がまったくありません。) 。どんな助けでも大歓迎です!

これがいくつかのシミュレーションデータ(crrstep-documentationからの調整された例)と私のコードの例です:

n <- 500
ftime <- rexp(n)
fstatus <- sample(0:2,n,replace=TRUE)
testdata <- matrix(runif(8*n),nrow=n)
testdata <- cbind(ftime,fstatus,testdata)
dimnames(testdata)[[2]] <- c('ftime','fstatus','x1','x2','x3','x4','x5','x6','x7','x8')
testdata <- as.data.frame(testdata)
formula1 <- ftime ~ 1 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8
rm(fstatus,ftime,n)

test.fun <- function(x,data,event){
require(crrstep)
select.mod<- crrstep(formula=x,,etype=event, failcode=1, cencode=0,data=data, 
                   direction = "backward", criterion = "AIC", crr.object = TRUE, 
                   trace = FALSE)
#Rest of function omitted for now
print(select.mod)
}

#Test
test.fun(x=formula1,data=testdata,event=fstatus) 
#I get: Error in eval(expr, envir, enclos) : object 'event' not found"

どうもありがとう!ロブ

4

2 に答える 2

5

データ フレーム内の名前の評価に依存する関数内で関数を呼び出す場合do.call、関数に渡す前にその引数を評価する を使用するため、デバッグとコードの記述の両方がより簡単になり、それが何であるかについてより確実になるように感じます。やっています。(デバッグの場合は、call代わりに を使用do.callしてください。これにより、関数が実行しようとする内容が表示されます。構文も少し異なるため、これを行う場合は、呼び出し内のリスト構造も削除します。)

(このアイデアに対する Josh O'Brien の回答へのクレジット: https://stackoverflow.com/a/7668846/210673 )

この場合、次のようになります。

test.fun <- function(x, data, event){
  require(crrstep)
  select.mod <- do.call("crrstep", 
         list(formula=x, etype=substitute(event), failcode=1, cencode=0,
              data=as.name("data"), direction = "backward", criterion = "AIC", 
              crr.object = TRUE, trace = FALSE))
  print(select.mod)
}

test.fun(x=formula1, data=testdata, event=fstatus) 

substitute(event)、 name ではなく、関数に付けられた名前を使用するように指示しますevent。は、実際のデータ フレームを渡すのではなく、関数内でas.name("data")検索するように指示します。data別のオプションはsubstitute(data)、実際のデータ フレームを探すことです。

使用例lm

lmweights引数を使用した非常によく似た動作の例を次に示します。

lm別の関数内ではなく、サンプル データ セットと への呼び出しを次に示します。応答のcall要素を出力して、実際に何が行われたかを確認します。

> set.seed(5)
> dd <- data.frame(x=1:10,y=round(rnorm(10,mean=10),1), z=round(runif(10,1,4),1))
> lm(y~x, weights=z, data=dd)$call
lm(formula = y ~ x, data = dd, weights = z)

wデータフレームで探しているため、機能しない自然な方法:

> f1 <- function(f,w,d){
+   lm(formula=f,weights=w, data=d)
+ }
> f1(y~x, z, dd)
Error in eval(expr, envir, enclos) : object 'w' not found

文字列を使用して呼び出しを構築できます。これはもう少し簡単です:

> f2 <- function(f,w,d){
+   do.call("lm", list(formula=as.formula(f), weights=as.name(w), data=as.name(d)))
+ }
> f2("y~x", "z", "dd")$call
lm(formula = y ~ x, data = dd, weights = z)

またはsubstitute、 ;を使用できます。ddここでは、関数内ではなく、実際のデータ セットで関数を呼び出してdいます。これは、後で を使用する場合に役立つ可能性がありますupdate

> f3 <- function(f,w,d){
+   do.call("lm", list(formula=f, weights=substitute(w), data=substitute(d)))
+ }
> f3(y~x, z, dd)$call
lm(formula = y ~ x, data = dd, weights = z)

しかしd、関数内で使用することもできます。今回data = dは、呼び出しの代わりにdata = dd.

> f4 <- function(f,w,d){
+   do.call("lm", list(formula=f, weights=substitute(w), data=as.name("d")))
+ }
> f4(y~x, z, dd)$call
lm(formula = y ~ x, data = d, weights = z)

実際のデータ フレームを挿入することもできますが、呼び出しは長くなります。ただし、各呼び出しの前にプログラムでデータ フレームを変更し、そのデータ フレームが何であるかを記録したい場合は、これが望ましい場合があります。(ただし、後で本当に必要な場合は、そのデータフレームをより明示的な方法で保存することをお勧めします。)

> f5 <- function(f,w,d){
+   do.call("lm", list(formula=f, weights=substitute(w), data=d))
+ }
> f5(y~x, z, dd)$call
lm(formula = y ~ x, data = list(x = 1:10, y = c(9.2, 11.4, 8.7, 
10.1, 11.7, 9.4, 9.5, 9.4, 9.7, 10.1), z = c(3.7, 3.2, 1.6, 1.7, 
1.4, 2.4, 2.3, 3.9, 1.4, 3.9)), weights = z)

の呼び出し内で が実行されるため、substituteなしでは使用できないことを示すもう 1 つの例です。do.callsubstitutelm

> f6 <- function(f,w,d){
+   lm(formula=f,weights=substitute(w), data=d)
+ }
> f6(y~x, z, dd)
Error in model.frame.default(formula = f, data = d, weights = substitute(w),  : 
  invalid type (symbol) for variable '(weights)'
于 2013-02-18T15:49:23.163 に答える
0

理由はよくわかりませんが、etype引数をインデックス付きデータ フレームとして渡すと失敗するようです。ただし、事前にベクトルを作成するとうまくいくようです:

test.fun <- function(x,data,event){
  require(crrstep)
  etype <- data[,event]
  select.mod<- crrstep(formula=x,data=data,etype=etype, failcode=1, cencode=0, 
                   direction = "backward", criterion = "AIC", crr.object = TRUE, 
                   trace = FALSE)
#Rest of function omitted for now
print(select.mod)
}
于 2013-02-18T10:58:02.670 に答える