2017-06-27 6 views
1
library(nlme) 
fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), 
       data = Loblolly, 
       fixed = Asym + R0 + lrc ~ 1, 
       random = Asym ~ 1, 
       start = c(Asym = 103, R0 = -8.5, lrc = -3.3), verbose = TRUE) 

# **Iteration 1 
# LME step: Loglik: -114.787, nlminb iterations: 1 
# reStruct parameters: 
#  Seed 
# -1.669062 
# PNLS step: RSS = 43.40812 
# fixed effects: 101.4496 -8.627331 -3.233751 
# iterations: 4 
# Convergence crit. (must all become <= tolerance = 1e-05): 
#  fixed reStruct 
# 0.02048682 0.02712258 
# 
# **Iteration 2 
# LME step: Loglik: -114.7428, nlminb iterations: 1 
# reStruct parameters: 
#  Seed 
# -1.624988 
# PNLS step: RSS = 43.40812 
# fixed effects: 101.4496 -8.627331 -3.233751 
# iterations: 1 
# Convergence crit. (must all become <= tolerance = 1e-05): 
# fixed reStruct 
#  0  0 

からのメッセージを格納するためにどのように、私はnlme関数呼び出しを参照していますが、私は解決策は、他のverbose = TRUE生成された出力に一般化になると思います。基本的には、** Iteration 1から始まる冗長なテキストを保存したいと思います。 Rでこれを行う方法はありますか?R:特に冗長= TRUE

編集:Gregor de Cillaの答えは、上記の例(アルゴリズムが収束したところ)でうまくいきます。アルゴリズムが収束しなかったらどうなるでしょうか?

u2 = evaluate({ 
fm2 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), 
      data = Loblolly, 
      fixed = Asym + R0 + lrc ~ 1, 
      random = Asym ~ 1, 
      start = c(Asym = 103, R0 = -10, lrc = -8), verbose = TRUE) 
}) 
> cat(u2[[2]]) 
# Error in cat(u2[[2]]) : object 'u2' not found 

答えて

1

evaluateパッケージは、このようなタスクに便利です。あなたは出力の種類がevaluate::new_output_handler documentationを見て、保存された上で、より良い制御をしたい場合はここでは例

library(evaluate) 
library(nlme) 

u = evaluate({ 
    fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), 
       data = Loblolly, 
       fixed = Asym + R0 + lrc ~ 1, 
       random = Asym ~ 1, 
       start = c(Asym = 103, R0 = -8.5, lrc = -3.3), verbose = TRUE) 
}) 

# get the output in character form 
output_str = u[[2]] 

# check if everything worked 
cat(output_str) 

です。関数内で自分の表現をラップエラーが発生した場合には

は、エラーメッセージが、その後 u2[[3]]からキャプチャすることができ

u2 = evaluate({ 
    function(){ 
    fm2 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), data = Loblolly, 
       fixed = Asym + R0 + lrc ~ 1, 
       random = Asym ~ 1, 
       start = c(Asym = 103, R0 = -10, lrc = -8), 
       verbose = TRUE) 
    } 
}) 

ことをお勧めします。出力用sink()とstderrのためsink(type = "message")

EDIT:あなたが尋ねたので、これを実行するとnew_output_handler機能がコンソールに戻って出力を送信するには

my_output_handler = new_output_handler(
    error = function(x) { 
    cat("source_prefix:", as.character(x)) 
    } 
) 

u2 = evaluate({ 
    function(){ 
    fm2 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), data = Loblolly, 
       fixed = Asym + R0 + lrc ~ 1, 
       random = Asym ~ 1, 
       start = c(Asym = 103, R0 = -10, lrc = -8), 
       verbose = TRUE) 
    } 
}, output_handler = my_output_handler) 

replay(u2) 
+0

ありがとうございます。エラーのあるモデルでこれを行う方法もありますか?私は私のメインポストを編集しました。 – Adrian

+0

私はすでに 'new_output_hanler'のドキュメントを指摘しました。そこで、エラーメッセージのコールバックを定義することができます。 –

+0

はい、わかりました。ドキュメントにはサンプルコードがないようですので、少し失われています。私は 'u2 = evaluate({ fm2 < - nlme(height、SSymymp(age、Asym、R0、lrc)、 のデータ= Loblolly、 固定= Asym + R0 + lrc〜1、 を試していますrandom = Asym 〜1、 start = c(Asym = 103、R0 = -10、lrc = -8)、verbose = TRUE) }、メッセージ=アイデンティティ、エラー=アイデンティティ、警告=アイデンティティ) '作業。 – Adrian