如何将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 s[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选择第二个元素。