gpt4 book ai didi

c++ - 在 C++ 项目中设置 R (C api)

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:06 25 4
gpt4 key购买 nike

我想在我自己的 cpp 项目中使用 R 包 (AlgDesign - https://github.com/jvbraun/AlgDesign/tree/master/src) 的 cpp 函数。

我常用的 IDE 是 Visual Studio 2015。我找到了这个相关帖子 Building R packages (C API) with Visual Studio (和 How do I compile a dll with R and RCPP? )所以我在我的 Windows 8.1 上安装了 MinGW 和 CodeBlocks IDE,然后重试。我将“Rdir/include”路径添加到 CodeBlocks 中的“项目构建选项->搜索目录->编译器”。

但我仍然得到“ undefined reference _GetRNGstate”,它等同于 MSVC“未解析的外部符号 _GetRNGstate”。所以我想这个问题是一个缺少的库,就像已经提到的原始提问者一样。但我也不知道是哪一个。我的 R 安装目录中没有 .lib 文件。

此外,我不打算使用 Rcpp 或构建自己的 R 包,我只想访问我自己的 cpp 项目中的 SEXP FederovOpt(..args) 函数

编辑: 假设我想将 AlgDesign src 文件一个函数一个函数地转移到一个空项目中。在某个时候我会达到这个:

#include "wheeler.h"

#include <string.h>
#include <stdlib.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <Rmath.h>
#include <R_ext/RS.h>
#include <R_ext/Utils.h>

/* Permute **********************************************************
| Randomly pemutes the n integers in a[] using the Fike
| algorithm. See Fike, "A permutation generation method" The Computer
| Journal, 18-1, Feb 75, 21-22.
*/

void Permute(
int *a,
int n
)
{
int i,
j,
temp;

GetRNGstate();
for (i = 1; i < n; i++) {
j = (int)((double)(1 + i)*unif_rand());
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
PutRNGstate();
}

int main(){

return 0;

}

我会得到 3 个 Unresolved external 问题void GetRNGstate(void) 在 R C API 的 Random.h 中定义void PutRNGstate(void) 在 R C API 的 Random.h 中定义double unif_rand(void) 定义在 R C API 的 Random.h 中

最后,我找到了这个帖子:https://www.codeproject.com/Questions/1192515/I-want-to-run-R-script-from-Cplusplus-code

当然,我正在搜索 .lib 文件。但是这个文件在 Windows 中不存在,我必须自己创建 .lib 文件。但我不知道如何。我找到了这个,但是它很旧而且目录完全不同:https://uploads.cosx.org/2009/12/Integrate-R-into-C.pdf

你能帮帮我吗?一个简单的“轻松使用 makefile”或单个 cmd 命令对我没有帮助,我无法理解。我以前从未使用过 makefile,也从未构建过 .lib。

最佳答案

我看到了两种可能的方法:

  1. 将 R 解释器嵌入到您的应用程序中,例如使用 Rinside包裹。然后你可以调用环绕 FederovOpt 的 R 函数.
  2. FederovOpt function 封装了一些执行实际工作的普通 C 函数。它的主要任务是将这些 C 函数与 R 接口(interface)。如果你不使用 R,否则你也可以提取这些 C 函数并直接使用它们。

使用哪种解决方案?如果您需要其他 R 功能,1. 可能更容易。查看 Rinside 附带的示例。您可能必须坚持使用 mingw,最好是 Rtools。如果这是您唯一需要的 R 功能,则 2. 可能是可行的方法。如果使代码独立于 R,则可以使用 VS。有一些例子做了类似的事情,例如https://github.com/zhanxw/libMvtnorm .在这两种情况下,您都必须遵守 GPL。

为了使选项二更加明确,我做了一个简单的测试:

  1. 下载FederovOpt.cwheeler.h .
  2. 删除所有#include s 个 R 特定 header 。
  3. 添加#include <math.h>#define s TRUEFALSE .
  4. 删除 R 特定函数 ProgAlloc , ProgDeallocFederovOpt
  5. 删除 R 特定函数调用 R_CheckUserInterrupt() , GetRNGstate()PutRNGstate() .
  6. 替换unif_rand()rand() / (RAND_MAX + 1.0) .

生成的文件可以用 gcc 编译没有错误或警告。当添加 main() 时,甚至可以在不需要 R 特定库的情况下链接它。 .在那里你会分配内存,调用FederovOptimize并再次释放内存。

顺便说一句,RNG 当然比 R 的 RNG 差很多,但可能足以完成这项任务。使用 C++11,您当然有更好的可能性。

关于c++ - 在 C++ 项目中设置 R (C api),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52069419/

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