gpt4 book ai didi

c++ - 在 Windows 上创建包含 C++ 的 R 包

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:17 27 4
gpt4 key购买 nike

我的目标是用 C++ 代码在 R 中创建一个包:那么我的问题是如何做?

我正在学习教程 http://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdf关于创建包含 C++ 代码的 R 包。我尝试编译和打包的具体代码与教程中描述的完全相同。

R CMD SHLIB 似乎正在创建 .dll 文件。我可以使用 dyn.load() 在 R 中加载并在模拟数据上测试它(如教程中所述)

R CMD INSTALL 是问题开始的地方。我做了两件事,遇到了两个据称相关的不同错误:

1) 教程说 NAMESPACE 文件应该包含代码:

useDynLib(XDemo)
export(XDemoAutoC)

当 R CMD INSTALL 失败导致错误时:

Error in inDL(x,as.logical(local), as.logical(now),...): unable to load shared object 'C:/.../libs/i386/XDemo.dll': Loadlibrary failure: 1% is not a valid Win32-program

2) 删除 NAMESPACE 文件中的上述行将导致安装包。我可以在 R 中成功加载它,但是当我尝试使用对 C++ 编写的函数进行 .C() 调用的 R 函数时,出现另一个错误:

library(newpackage)
ls(package:newpackage)
[[1]] "XDemoAutoC"
Warning message:
In ls(package:newpackage) :
‘package:newpackage’ converted to character string
XDemoAutoC(c(1,2,3,4))
Error in .C("DemoAutoCor", OutVec = as.double(vector("numeric", OutLength)), :
C symbol name "DemoAutoCor" not in load table

我在 Windows 64 位上运行版本 R2.15.2 并使用 R64 位。

我读了下面有类似问题的帖子: http://r.789695.n4.nabble.com/Include-C-DLL-error-in-C-symbol-name-not-in-load-table-td3464021.html

除了他们只字未提 NAMESPACE 问题。

我也看了这篇文章: Problem with loading compiled c code in R x64 using dyn.load

所以我在想:基于我能够在 Rx64 中使用 dyn.load() 的事实意味着我已经成功创建了 x64 .dll。假设 NAMESPACE 文件应该保留在教程中 - 希望修复 >>not in load table<< 错误 - 这意味着我应该专注于解决问题一。这个问题似乎是由与 32 位相关的东西引起的。我在 .dll 文件上使用了 Dependency Walker,但我不确定如何解释结果 enter image description here

我真的不知道如何解决这个问题,所以欢迎提出任何建议?

最佳答案

我认为你做错了。两个快速建议:

  1. 阅读Writing R Extensions编写手册就是为了解释这一点:编写 R 扩展包括那些带有编译代码的

  2. 看看Rcpp这使得 R 和 C++ 扩展,包括包构建变得更加容易。或者我们认为。编写包就像调用 Rcpp.package.skeleton() 一样简单。 1) 中的文档仍然有帮助。

也就是说,如果 R CMD INSTALL 失败,您的 $PATH 中可能有一些混淆。永远不要混合使用 MinGW 和 Cygwin。确保在构建或调用 R 时没有找到 Cygwin DLL。路径顺序非常很重要。详情请参阅手册。

关于c++ - 在 Windows 上创建包含 C++ 的 R 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15666508/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com