Tag: r

R外部接口

我想实现一些用C代码编写的R包。 C代码必须: 取一个数组(任何类型)作为输入。 产生数组作为输出(不可预测的大小)。 实现数组传递的最佳实践是什么? 目前用.C()调用C代码。 它通过指针直接从R访问数组。 不幸的是,对于输出不能做同样的事情,因为输出尺寸需要事先知道,这在我的情况下是不正确的。 将数组从C传递到R通过文件是否有意义? 例如,在ramfs中,如果使用linux? 更新1: 这里讨论了完全相同的问题。 在那里,提到了返回具有未知尺寸的arrays的可能选项: 在计算数组之前但在已知尺寸之后将外部函数拆分为两个。 第一部分将返回维度,然后将准备空数组,然后第二部分将运行并在R中填充数组。 在我的情况下,只有在执行整个代码时才知道完整维度,因此这种方法意味着运行C代码两次。 猜测最大数组大小也不是可选的。 更新2:似乎只有这样做的方法是使用.Call()代替,如同建议的功率。 以下是一些很好的例子: http : //www.sfu.ca/~sblay/RC-interface.ppt 。 谢谢。

R中的GSL库

我正在写一个我将在R中使用的C代码。为了在C中进行矩阵运算,我添加了“gsl_matrix”库。 当我使用R CMD SHLIB编译时,它编译没有问题。 但是当我打开R并尝试编写dyn.load(“file.so”)时,我收到一条错误消息: unable to load shared object file.so undefined symbol: gsl_matrix_alloc 我的错误在哪里?

创建链接到Rust dylib的共享C对象以在R中使用

我正在尝试创建一个可以加载到R中的共享对象,它通过R的C API调用Rust函数。 要从C调用Rust,我正在关注此博文 。 当我尝试创建共享库并链接到Rust库时,我的问题出现了。 链接器抱怨它无法找到我的Rust函数。 我对编译语言很陌生,在转向SO之前已经花了几天的努力。 在那段时间里,我学到了很多关于编译器标志的知识,但却没有更接近解决方案。 我认为这可能是显而易见的事情。 我的C ++代码: #include “Rinternals.h” #include “Rh” #include “treble.h” // test.cpp extern “C” { SEXP triple(SEXP val) { int32_t ival = *INTEGER(val); Rprintf(“9 tripled is %d\n”, treble(ival)); return R_NilValue; } } treble.h: #include int32_t treble(int32_t value); 我的Rust代码: #![crate_type = “dylib”] #[no_mangle] pub extern fn treble(value: i32) -> […]

计算3D网格的表面积

我有一个由椎骨和三角形定义的3D网格。 我也有网格的法线。 我想计算网格的面积,假设它总是关闭的。 我在这个问题中发现了一个有趣的3D体积计算实现,我在C代码中应用它来构建一个由R调用的函数。这是代码: double SignedVolumeOfTriangle(double p1X, double p1Y, double p1Z, double p2X, double p2Y, double p2Z, double p3X, double p3Y, double p3Z) { double v321 = p3X*p2Y*p1Z; double v231 = p2X*p3Y*p1Z; double v312 = p3X*p1Y*p2Z; double v132 = p1X*p3Y*p2Z; double v213 = p2X*p1Y*p3Z; double v123 = p1X*p2Y*p3Z; return (double)(1.0/6.0)*(-v321 + v231 + v312 – […]

处理从R到C的列表并访问它

我想在C中使用一个列表,我从R得到了。我意识到问题与此非常类似: 使用.call()将dataframe从-R传递到R和C. 但是,我无法将其存储在指针“* target”中,我将从中进一步使用它。 R: .Call(“processlist”, list(c(1,2), c(1,3,2), c(1,5,4,4))) 在C: #include #include extern “C” { SEXP processlist(SEXP lst); } SEXP processlist(SEXP lst){ SEXP vec = PROTECT(allocVector(VECSXP, 2)); SET_VECTOR_ELT(vec, 0, VECTOR_ELT(c, 0); SET_VECTOR_ELT(vec, 1, VECTOR_ELT(c, 1); SET_VECTOR_ELT(vec, 2, VECTOR_ELT(c, 2); const lngth = 3; int *target[lnght]; // Here i want to fill “target”, but how? int […]

如何将R字符向量转换为C字符指针?

我正在尝试将字符向量从R传递给C并通过C字符指针引用它。 但是,我不知道要使用哪种类型的转换宏。 下面是一个小测试,说明了我的问题。 文件test.c: #include SEXP test(SEXP chars) { char *s; s = CHAR(chars); return R_NilValue; } 文件测试.R: dyn.load(“test.so”) chars <- c("A", "B") .Call("test", chars) R的输出: > source(“test.R”) Error in eval(expr, envir, enclos) : CHAR() can only be applied to a ‘CHARSXP’, not a ‘character’ 有什么线索吗?

在R代码中传递种子/设置种子/ C.

我在R代码中制作C. 在我的C代码中,我使用rand()函数生成随机数。 R-ext.pdf说我必须使用命令设置种子; GetRNGstate(); PutRNGstate(); 虽然我使用上面的这些命令,但我仍然为同一种子获得不同的值。 你能帮我一下吗? 最小的例子是: 在C: # include # include # include # include SEXP example(){ SEXP output; GetRNGstate(); PROTECT(output = allocVector(INTSXP, 1)); INTEGER(output)[0] = rand() % 50; PutRNGstate(); UNPROTECT(1); return(output); } 在R: dyn.load(“example.so”) ## The following codes return different values at ever run set.seed(1) .Call(“example”) 提前致谢。

R-Perl安装GCC 4.0的问题:如何删除不必要的-arch标志

我想安装R-Perl模块以在Perl中使用R,但是没有成功使用命令sudo R CMD INSTALL –configure-args=’–with-in-perl’ RSPerl/如下所示: http ://www.omegahat.org/RSPerl/RFromPerl.html 。 我之前发布过有关此问题的信息,并确定我遇到了新的GCC 4.2问题。 但是,我现在正在使用GCC 4.0.1并且遇到了不同的问题。 以下是上述命令的输出: * installing to library ‘/Library/Frameworks/R.framework/Versions/2.13/Resources/library’ * installing *source* package ‘RSPerl’ … checking for perl… /usr/bin/perl No support for any of the Perl modules from calling Perl from R. ***************************************************** Set PERL5LIB to /Library/Frameworks/R.framework/Versions/2.13/Resources/library/RSPerl/perl ***************************************************** Testing: -F/Library/Frameworks/R.framework/.. -framework R Using ‘/usr/bin/perl’ as […]

sprintf无效格式’%d’

这有效: > sprintf(‘%d’, c(1, 1.5)) [1] “1” “1” 这不是: > sprintf(‘%d’, c(1.5, 1)) Error in sprintf(“%d”, c(1.5, 1)) : invalid format ‘%d’; use format %f, %e, %g or %a for numeric objects 为什么?

R:使用带有.Call和C / C ++包装器的Fortran子例程代替.Fortran的优点?

我有一个R包,它使用大量的Fortran子程序来进行递归线性代数计算的嵌套循环(严重依赖于BLAS和LAPACK例程)。 作为Fortran的接口,我使用.Fortran函数。 我刚刚阅读了Jonathan Callahan关于在C / C ++编写的子程序中使用.Call而不是.C 的博客文章 ,它让我觉得在使用Fortran子程序时,通过写一个简单的方法也可以更好地使用.Call接口C中的包装器然后调用Fortran子例程? 如上所述,我的Fortran代码非常简单,因为我只使用double或integer类型的多维数组。 但是我已经知道我必须在R端编写相当多的检查以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等。 子程序写为F90 / 95。