2017-10-17 13 views
0

forループをlapplyに置き換えてコードを高速化しようとしています。私は多くの異なるサンプルでnlsモデルを実行しており、coefsを抽出していますが、いくつかのサンプルはいくつかのモデルが収束していません。私はこれらのサンプルを無視するtrycatchのforループでこれを処理できますが、lapplyで動作するようにはできません。私がこれを実行すると、私はsample.codeとNULLのリストを取得します。返す場所はどこですか(nls.dat)?私はNULLを終わらせるわけではありませんか?lapplyとtrycatchからのNULL出力

test.func <- function (SCDF){ 
    tryCatch({ 
    mod.allDIDO <- nlsLM (BM~Cr*(1 - R * exp(-Kr*day) - (1 - R) * exp(-Kr2*day)), data=dat[dat$sample.code %in% SC,], start=list(Cr=DI.Cr,R=DI.r,Kr=DI.Kr,Kr2=DI.Kr2), 
         control = nls.lm.control(maxiter = 500), lower = c(-Inf, 0, 0, 0), upper = c(Inf, 1, Inf, Inf)) 
    nls.dat <- c("df", coef(mod.allDIDO)[1], coef(mod.allDIDO)[2], coef(mod.allDIDO)[3], coef(mod.allDIDO)[4], deviance(mod.allDIDO), logLik(mod.allDIDO)) 
    return (nls.dat) 
    }, error = function(e){}) 
} 

test1 <- lapply(split(dat, dat$sample.code), test.func) 

編集いくつかのデータを含めるとカールに返信する: 私はあなたの提案(カール)を試してみましたが、私はまだNULLを取得し、に注意を払う事で、あなたのある削減バージョン

x1 <- 0:60 
y1 <- 774*(1 - 0.5 * exp(-0.2*x1) - (1 - 0.5) * exp(-0.016*x1)) 
test.dat <- data.frame (x1, y1) 

    nls.dat <- tryCatch({ 
    mod.allDIDO <- nlsLM(y1~Cr*(1 - R * exp(-Kr*x1) - (1 - R) * exp(-Kr2*x1)), 
         data=test.dat, 
         start=list(Cr=774,R=0.5,Kr=0.2,Kr2=0.016), 
         control = nls.lm.control(maxiter = 500), 
         lower = c(-Inf, 0, 0, 0), 
         upper = c(Inf, 1, Inf, Inf)) 
    nls.dat <- c("df", coef(mod.allDIDO)[1], 
       coef(mod.allDIDO)[2], 
       coef(mod.allDIDO)[3], 
       coef(mod.allDIDO)[4], 
       deviance(mod.allDIDO), 
       logLik(mod.allDIDO)) 
    return(nls.dat) 
    }, error = function(e){}) 

    nls.dat ## NULL 

答えて

0

を見ます呼び出し環境。 tryCatchの括弧内には、含まれている呼び出しを独自の関数として扱います。だから、そうのように、親環境へtryCatchのretuirnを返し、その後、関数から返す必要があります。

test.func <- function (SCDF){ 
    nls.dat <- tryCatch({ 
    mod.allDIDO <- nlsLM(BM~Cr*(1 - R * exp(-Kr*day) - (1 - R) * exp(-Kr2*day)), 
         data=dat[dat$sample.code %in% SC,], 
         start=list(Cr=DI.Cr,R=DI.r,Kr=DI.Kr,Kr2=DI.Kr2), 
         control = nls.lm.control(maxiter = 500), 
         lower = c(-Inf, 0, 0, 0), 
         upper = c(Inf, 1, Inf, Inf)) 

    nls.dat <- c("df", coef(mod.allDIDO)[1], 
       coef(mod.allDIDO)[2], 
       coef(mod.allDIDO)[3], 
       coef(mod.allDIDO)[4], 
       deviance(mod.allDIDO), 
       logLik(mod.allDIDO)) 
    return(nls.dat) 
    }, error = function(e){ 
    NULL 
    }) 
    return(nls.dat) 
} 

編集奇妙な行動だ

...ので、私は別の方法をテストしている私は希望決してしません...何らかの理由でそれが動作します... 新しい関数は変数をとり、ifステートメントを追加して別のものを追加します...一見不要な論理チェックですが動作します。チェックした値がNULLではないに戻り、エラーが2段階のどこにでも存在する場合...それはerror = function(e) {NULL}

f <- function(x1, y1, test.dat){ 
    tryCatch({ 
     mod.allDIDO <- nlsLM(y1~Cr*(1 - R * exp(-Kr*x1) - (1 - R) * exp(-Kr2*x1)), 
         data=test.dat, 
         start=list(Cr=774,R=0.5,Kr=0.2,Kr2=0.016), 
         control = nls.lm.control(maxiter = 500), 
         lower = c(-Inf, 0, 0, 0), 
         upper = c(Inf, 1, Inf, Inf)) 
    nls.dat <- c("df", coef(mod.allDIDO)[1], 
       coef(mod.allDIDO)[2], 
       coef(mod.allDIDO)[3], 
       coef(mod.allDIDO)[4], 
       deviance(mod.allDIDO), 
       logLik(mod.allDIDO)) 
    if(!is.null(nls.dat)){ 
     return(nls.dat) 
    }else { 
     NULL 
    } 
}, error = function(e){NULL}) 
} 

、実行にデフォルト設定ならば...

> f(x1 = x1, y1 = y1, test.dat = test.dat) 
      Cr  R  Kr  Kr2     
    "df" "774" "0.5" "0.2" "0.016"  "0" "Inf" 
+0

こんにちはカール、私はあなたの提案を試みたが、出力はまだNULLであった、編集された質問のカットダウンバージョンといくつかのデータを参照してください。上記の – chris20

+0

は編集後...データをありがとう。また、あなたが使用しているパッケージをインクルードしていれば、 'minpack.lm'を捜しておいても役に立ちます。なぜ論理的な二重取りが有用であるのかという手掛かりはありませんが、それは機能します。 –

+0

Carlさん、ありがとう、申し訳ありません、私はパッケージを追加するのを忘れました。 – chris20

関連する問題