Tag: r

在子目录中构建共享库

我正在尝试构建一个使用一些C代码的R包。 我有一个C库,它被编译成可执行文件,可以从命令行调用。 有一个与之关联的Makefile。 我试图在这里查看信息 如果要创建然后链接到库,比如使用子目录中的代码,请使用类似的东西 .PHONY: all mylibs all: $(SHLIB) $(SHLIB): mylibs mylibs: (cd subdir; make) 小心创建所有必需的依赖项,因为无法保证所有依赖项都以特定顺序运行(并且某些CRAN构建机器使用多个CPU和并行产生)。 如果我在我的包中创建一个src文件夹的新子目录,名为someLibrary ,代码和Makefile保持不变,反过来,在我的包的原始Makevars文件中,我将上面的代码保持不变,那么我将能够构建要使用useDynLib导出的共享库? 编辑1: 在这里的信息,我更改了Makefile以通过添加创建共享库 CFLAG = -fPIC -g -O3 LDFLAGS= -shared 但是,这会导致.so文件不直接导出到包的libs目录的问题。 如果我硬编码到目标的路径,那么文件将被发送到包的libs目录(这是通过调用R CMD INSTALL myPackage )。 编辑2: 最后,我想知道如何调用共享库,因为它有一个main()方法,我可以从命令行可执行文件中调用它。 将它暴露给R NAMESPACE的过程是什么,以便可以通过.Call调用.Call ? PS。 如果我将最后一点作为一个单独的问题,请告诉我。

如何通过传递参数从C ++调用R函数

我试图从C ++程序调用我的R函数。 rtest = function(input ,output) { a <- input b <- output outpath <- a+b print(a+b) return(outpath) } 这是我的Rfunction。 我需要找到一种通过传递参数从C调用此函数的方法。 通过传递参数从python代码调用R函数 。 这里我做了类似的方法从python调用R。 所以我需要指定R脚本的路径和函数的名称,并且还能够通过python传递参数。 我在C中寻找类似的方式但是没有得到结果。 这可能是一件简单的事情。 任何帮助表示赞赏。

‘unlockEnvironment’通过’Rcpp’而不是’inline’实现

实际问题 有人可以让我开始我需要做什么来实现unlockEnvironment下面的unlockEnvironment代码? 背景 看过这篇文章 ,尝试了基于C代码的Winston Chang的解决方案。 它有效,但我觉得我知道太少(实际上没什么,都是)关于内联或C / C ++来真正知道我在做什么;-) 所以我认为这将是一个很好的机会,最终开始学习如何使用R作为C和C ++的接口。 而且我想我会跳上Rcpp火车这样做! Winston’s Gist的代码 require(“inline”) inc <- ' /* This is taken from envir.c in the R 2.15.1 source https://github.com/SurajGupta/r-source/blob/master/src/main/envir.c */ #define FRAME_LOCK_MASK (1<<14) #define FRAME_IS_LOCKED(e) (ENVFLAGS(e) & FRAME_LOCK_MASK) #define UNLOCK_FRAME(e) SET_ENVFLAGS(e, ENVFLAGS(e) & (~ FRAME_LOCK_MASK)) ' src <- ' if (TYPEOF(env) == NILSXP) […]

可以从C或Fortran读取.Rdata文件格式吗?

我正在C上写一些R扩展(从R调用C函数)。 我的代码需要同时使用2个不同的数据集来计算统计量,我需要使用所有可能的对组合来执行此操作。 然后,我需要所有这些统计信息(非常大的数组)来继续C侧的计算。 这些文件非常大,通常约为40GB,这就是我的问题。 要在R调用的C上执行此操作,首先我需要加载R中的所有数据集以将它们传递给C函数调用。 但是,理想情况下,如果我能够直接从C或Fortran访问数据集,则可以按顺序在内存中同时维护这些文件中的2个: open file1 – open file2 – compute cov(1,2) close file2 hold file1 – open file3 – compute cov(1,3) … // same approach 这在R上很好,因为我可以加载/卸载文件,但是在调用C或Fortran时我没有任何加载/卸载文件的机制。 所以,我的问题是, 我可以直接从Fortran或C读取.Rdata文件,能够打开/关闭它们吗? 问题的任何其他方法? 据我所知,答案是否定的。 所以,我正在考虑从Rdata迁移到HDF5。

在会话中更改tempdir()(更新R_TempDir)

我正在寻找一种方法来在R会话开始后更改tempdir()位置。 我认为需要更新C级全局变量R_TempDir 。 在R内做这件事的好方法是什么?

Rcpp:将C数组作为NumericMatrix返回到R

#include #include extern “C” { #include “cheader.h” } using namespace Rcpp; // [[Rcpp::export]] NumericVector cppfunction(NumericVector inputR){ double const* input = inputR.begin(); size_t N = inputR.size(); double output[10*N]; cfunction(input, N, output); std::vector outputR(output, output + sizeof(output) / sizeof(double)); return wrap(outputR); } 这是有效的,除了我必须手动将矢量outputR转换为R中的矩阵。我当然也可以使outputR到NumericMatrix(或者我可以?)然后返回,但我真正的问题是上述过程是最优的吗? 我是否必须先将输出转换为std :: vector,然后再转换为NumericVector / Matrix,还是可以以某种方式避免这种情况? 我试着直接包装输出但是没有用。

R包链接到外部C库

我有一些利用igraph库的c代码。 我想在它周围放一个R包装并将其作为R包发送给CRAN。 igraph已经在CRAN上有一个R端口,所以我的R包’foo’依赖于R的igraph是有意义的。 由于foo使用自己的C代码依赖于C igraph,我如何将我的C函数链接到原始的igraph库? 我已经读过这是在一个名为Makevars的文件中完成的,但链接到外部库非常多毛。 如果这是不可能的,那么复制整个igraph源代码并将整个内容放入我的/ src目录是否更好? R igraph包已经有一个名为Makevars的文件,但我不明白如何构建所有的c文件 – 通常在我的Makefile中我有类似gcc(一些.c源文件列表)-o,但Makevar只包含 PKG_CFLAGS=-DUSING_R -I. -Ics -Iglpk -Iglpk/amd -Iglpk/colamd \ -g -O2 -I/usr/include/libxml2 -g -O2 -I/usr/include/libxml2 -DNDEBUG \ -DPACKAGE_VERSION=\”0.6\” -DINTERNAL_ARPACK \ -DIGRAPH_THREAD_LOCAL=/**/ PKG_CXXFLAGS= -DUSING_R -DIGRAPH_THREAD_LOCAL=/**/ -DNDEBUG PKG_LIBS=-lxml2 -lz -lpthread -licucore -lm -lgmp $(FLIBS) $(LAPACK_LIBS) $(BLAS_LIBS) all: $(SHLIB) 并且没有其他Makefile。 总之,我如何将C代码放入依赖于另一个C库的R包中,如何编写相应的Makevars(或Makefile)来合并C函数? 这里发布了一个较旧的问题,但似乎只是链接到帮助编写自己的C代码,而不依赖于任何东西。

使用dyn.load在R x64中加载编译的c代码时出现问题

我最近从一台32位笔记本电脑转到64位台式机(均为win7)。 我刚刚发现我在使用dyn.load加载dll时出现错误。 我想这是一个简单的错误,我忽视了一些事情。 例如,我写这个简单的c函数(foo.c): void foo( int *x) {*x = *x + 1;} 然后在命令提示符下编译它: R CMD SHLIB foo.c 然后在32位RI可以在R中使用它: > dyn.load(“foo.dll”) > .C(“foo”,as.integer(1)) [[1]] [1] 2 但在64位RI获得: > dyn.load(“foo.dll”) Error in inDL(x, as.logical(local), as.logical(now), …) : unable to load shared object ‘C:/Users/Sacha/Documents/R/foo.dll’: LoadLibrary failure: %1 is not a valid Win32 application. nd. 编辑: 作为参考,可以使用–arch 64x在架构中强制使用R […]

怎么读大json?

我收到了带有要在R中分析的数据的json文件,为此我使用了RJSONIO包: library(RJSONIO) filename <- "Indata.json" jFile <- fromJSON(filename) 当json文件大于约300MB(未压缩)时,我的计算机开始使用交换内存并继续解析(fromJSON)几个小时。 一个200MB的文件只需要一分钟就可以解析。 我在Ubuntu 64bit和16GB RAM上使用R 2.14(64位),所以我很惊讶需要交换大约300MB的json。 我怎么能读大jsons? 内存设置中有什么东西搞砸了吗? 我已重新启动R并仅运行上面的三行。 json文件包含2-3列短字符串,10-20列包含0到1000000之间的数字。即,它是大小的行数(在解析数据中超过一百万行)。 更新:从评论中我了解到rjson在C中做得更多,所以我试了一下。 带有RJSONIO(根据Ubuntu系统监视器)的300MB文件达到了100%的内存使用率(从6%基线开始)并继续进行交换,只需要60%的内存和rjson包,并且在合理的时间(分钟)内完成解析。

Rh和Rmath.h在本机C程序中

“Rh”和“Rmath.h”是R.app和C之间接口的头文件。但是,它们似乎只能通过R命令’R CMD SHLIB something.c’读取。 我希望编译我的本机C程序,使用gcc包含它们。 我正在使用Snow Leopard,我无法找到那些头文件! 有帮助吗?