2014-02-21 62 views
0

所以我在R中使用了編譯好的Fortran代碼。使用此功能時,lsoda,包deSolve。我得到的消息打印到屏幕上像如果(打印出的東西)x = false,如何在R中執行此操作?

DLSODA- At current T (=R1), MXSTEP (=I1) steps 
     taken on this call before reaching TOUT  
In above message, I = 
[1] 5000 
In above message, R = 
[1] 21.31629 

問題是,上述不是「警告」或「錯誤」;看到此消息後,is.null(warnings())的計算結果爲TRUE。如果這是一個警告,我可以寫x = is.null(warnings()),那就可以了。我可以使用tryCatch來查找錯誤,但是那些既不是錯誤也不是警告的消息呢?

我問這個問題的原因是這個函數在for循環中的while循環中被調用。如果打印此消息,我希望while循環中斷,然後讓外循環移到下一次迭代。通常你會使用tryCatch做這樣的事情,但因爲沒有錯誤,我不知道如何做到這一點

+1

您可以重定向輸出,然後檢查它是否包含類似的東西。請提供可重複的示例 –

+0

@JulianUrbano嗯,不知道你是什麼意思,我想知道這是因爲我想要一個內部while循環打破,如果此消息被打印,然後爲外部while循環移動到下一次迭代。通常你會使用tryCatch做這樣的事情,但因爲沒有錯誤,我不知道如何做到這一點 – MHH

+2

請給我們一個可重複的例子,所以我們可以告訴你如何重定向 –

回答

1

您可以重定向輸出,然後檢查是否lsoda印刷的東西:

out <- capture.output(lsoda(...)) 
if(length(grep("In above message", out))!=0) { 
    # error 
} 

我們基本檢查由lsoda打印的任何行是否包含字符串In above message。如果您需要從lsoda使用的結果,你也可以像這樣運行:

out <- capture.output(result <- lsoda(...)) 

如所建議的,你也可以使用grepl

if(any(grepl("In above message", out))) { 
    # error 
} 
+2

或'grepl'作爲快捷方式 – rawr

+0

capture.output正是我所期待的!非常感謝。只要我驗證了這一點,我會盡快接受答案(看起來應該如此)。 – MHH