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

编辑:Thomas Petzoldt 在 R 帮助列表中的 REAL 解决方案:

[错误] 如果在编译模型之后加载包 deSolve,则会发生...解决方案是在 [加载 DLL 之前] 之前加载 deSolve,理想情况下是在脚本的最开头,并且至少在加载/卸载 DLL 之前/ 。所以

如果这不起作用,下面也可以(旧答案):

我找到了一个有点不雅的解决方案。

问题似乎是 deSolve 中的“unlock_solver”函数无法正确访问。您可以卸载并重新加载整个 deSolve.so 文件,而不是重新启动 R。

为此,您可以使用以下内容:

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-help 列表发送了一个请求,询问是否有某种方法可以更改 R 查找“unlock_solver”的位置,或者只是卸载/重新加载 deSolve 的一部分。

于 2013-11-06T17:57:07.357 回答
1

确保您已安装以下软件包(在脚本开头)以编译 .dll 文件。

packages <- c("deSolve","coda", "adaptMCMC")  
if(require(packages)){
    install.packages(packages,dependencies = T)
  }
ppp <- lapply(packages,require,character.only=T)

首先删除 wdir 中的当前 .dll 文件

c_compile <- "your_c_file"
dyn.unload(paste0(c_compile,".dll")) # unload dll (Windows only)

然后编译C文件和.dll

system(paste0("R CMD SHLIB ",c_compile,".c"))
dyn.load(paste0(c_compile,".dll"))# Load dll (Windows only)
于 2019-07-23T19:50:02.910 回答