如何将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'
有什么线索吗?
字符向量是STRSXP
。 每个元素都是CHARSXP
,所以你需要像(未经测试的):
const char *s; s = CHAR(STRING_ELT(chars, 0));
请参阅编写R扩展的处理字符数据部分 。 如果您只使用C ++和Rcpp,Dirk将很快告诉您这一切将如何变得更容易。 🙂
可以通过使每个字符通过指针CHAR(STRING_ELT(chars, i)
,其中0 <= i
#include #include SEXP test(SEXP chars) { int n, i; char *s; n = length(chars); s = malloc(n + 1); if (s != NULL) { for (i = 0; i < n; i++) { s[i] = *CHAR(STRING_ELT(chars, i)); } s[n] = '\0'; } else { /*handle malloc failure*/ } return R_NilValue; }
根据乔希的要求:
R> pickString <- cppFunction('std::string pickString(std::vector invec, int pos) { return invec[pos]; } ') R> pickString(c("The", "quick", "brown", "fox"), 1) [1] "quick" R>
C向量为零偏移,因此1选择第二个元素。