4

MCMC アルゴリズムで deSolve パッケージを使用して ODE のパラメーターを推定し、ソルバーで使用される関数を C で記述してアルゴリズムを高速化しました。Error in .C("unlock solver")関数を実行すると、常にではありませんが、エラーが発生することがありodeます。コマンドを使用して C ファイルを正常にコンパイルおよびリンクできます。

system("R CMD SHLIB [insert-file-path]")
dyn.load("[dll-file-path]")

しかし、dll ファイルを使用して ODE を解こうとすると、エラーがスローされます。次に、以下のような単純なスクリプトを実行しても、同じエラーが発生します。この問題はコンパイルされたコードの使用に関連していると思いますが、方法がわからず、このエラーに関する参照が見つかりません。

> require(deSolve)
> initVal <- c(y=1)
> times <- seq(0, 1, 0.001)
> parms <- c(k=1)
> model1 <- function(t, y, parms){
+   with(as.list(c(y, parms)),{
+     dy <- -k*y;
+     list(c(dy))
+   })
+ }
> out <- ode(y=initVal, times=times, parms=parms, func=model1)
Error in .C("unlock_solver") : 
  "unlock_solver" not resolved from current namespace (deSolve)

部分的な解決策 R を再起動し、関数を使用して DLL のみをロードしdyn.load、コードをコンパイルしない場合、ode関数はエラーなしで実行されます。これで問題は解決しましたが、まだ理由がわかりません。

4

2 に答える 2

6

編集: R ヘルプ リストの Thomas Petzoldt による REAL ソリューション:

コンパイルされたモデルの後にパッケージdeSolveがロードされると、[エラー]が発生します...解決策は、[DLLをロードする前]の前に、理想的にはスクリプトの最初で、少なくともDLLをロード/アンロードする前にdeSolveをロードすることです/ 。それで

それがうまくいかない場合は、以下も同様です(古い回答):

私はやや洗練されていない解決策を見つけました。

問題は、deSolve 内の「unlock_solver」関数が何らかの形で正しくアクセスされていないことです。R を再起動するのではなく、deSolve.so ファイル全体をアンロードして再ロードできます。

これを行うには、次のようなものを使用できます。

require(deSolve)

# encounter error

library.dynam.unload("deSolve", libpath=paste(.libPaths()[1], "//deSolve", sep=""))
library.dynam("deSolve", package="deSolve", lib.loc=.libPaths()[1])

「.libPaths()[1]」が .libPaths 変数の最初の要素にない場合は、deSolve をインストールした場所に置き換える必要があります。

ただし、これはスレッジハンマーのようなものです。R が "unlock_solver" を検索する場所を変更する方法、または deSolve の一部を単にアンロード/リロードする方法があるかどうかを尋ねるリクエストを r-help リストに送信しました。

于 2013-11-06T17:57:07.357 に答える