謹此的R包,它的芯用C++編寫和基本上由一個長運行循環的:R:如何寫中斷C++函數,並恢復部分結果
void core_func(double* data)
{
while (!done)
{
// update 'data'
}
}
呼叫,使用R的.C
機構由:
ans <- .C("core_func", data = as.double(data))$data
我們希望用戶能夠中斷功能,並收回部分結果(即,在中斷的點*data
內容)。
問題:這是以任何方式可能嗎?
我們的努力拿出一個解決方案迄今已生產this post,其中 - 如果正確解釋 - 對如何幹淨地從循環退出的指示。
void core_func(double* data)
{
while (!done && !checkInterrupt())
{
// update 'data'
}
}
我們還沒有統計出來,是如何傳遞的部分結果返回給調用者(又名:R用戶)。
解決方案:似乎這個解決方案在我們面前一直都是正確的。 Simon Urbanek在上述文章(原文here)中提出的方法涵蓋了所有的基礎。利用函數checkInterrupt()
,可以將C++代碼設計爲在用戶中斷時完全退出;最重要的是,控制權將交給R中的調用函數.C
,該函數可以按順序返回(部分)結果。
感謝@Jeroen的清理工作(以及關於searching for code的提示METACRAN)!
關於Jeroen回答中的更新的注意事項:我們希望保持C++代碼與R不可知(排除對Rcpp的依賴)。
你是什麼意思中斷?用戶可以中斷,例如通過某個按鍵進行操作? – dimm
@dimm是的,從用戶的角度來看,這將是最簡單的解決方案(例如,擊中'Crtl-c')。 –
我的建議是將循環嵌套在'try' - 'catch'塊中,並在檢測到中斷時引發異常。這應該夠了。 – Gonmator