【发布时间】:2016-02-25 21:21:36
【问题描述】:
我使用 C 库在 R 中工作。我需要将一个数字在 1 到 10 之间的数组传递给 C 函数,但这也可能是“NA”。然后在 C 中,根据我需要设置输出的值。 这是一个简化的代码
heredyn.load("ranking.so")
fun <- function(ranking) {
nrak <- length(ranking)
out <- .C("ranking", as.integer(nrak), as.character(ranking), rr = as.integer(vector("integer",nrak)))
out$rr
}
ranking <- sample(c(NA,seq(1,10)),10,replace=TRUE)
rr <- fun(ranking)
C 函数可以是这样的
#include <R.h>
void ranking(int *nrak, char *ranking, int *rr) {
int i ;
for (i=0;i<*nrak;i++) {
if (ranking[i] == 'NA')
rr[i] = 1 ;
else
rr[i] = (int) strtol(&ranking[i],(char **)NULL,10) ;
}
}
由于“NA”值我将排名设置为字符,但也许还有另一种方法可以做到这一点,使用整数并且在调用函数之前不将“NA”替换为 0?
(像这样的代码,总是给我一个零数组...)
【问题讨论】:
-
不要像
NULL宏一样强制转换空指针常量。一般规则是不要使用不必要的演员表。 -
好的。感谢!但我认为这不能解决问题
-
评论不是为了回答。
-
无论如何,你的意思是我应该简单地做
(int) strtol(&rating[i],NULL,10)? -
当然!请注意,您确保使用 C 编译器。尝试使用 C++ 编译器编译 C 代码通常会导致麻烦。相同的语法并不意味着相同的语义。
标签: c r parameter-passing dynamic-library