我正在尝试将字符向量从R传递给C并通过C字符指针引用它。但是,我不知道要使用哪种类型的转换宏。下面是一个小问题,说明了我的问题。
文件test.c:
#include <Rinternals.h>
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'
任何线索?
答案 0 :(得分:7)
字符向量为STRSXP
。每个元素都是CHARSXP
,所以你需要像(未经测试的):
const char *s;
s = CHAR(STRING_ELT(chars, 0));
请参阅Handling Character Data section of Writing R Extensions。如果您只使用C ++和Rcpp,Dirk将很快告诉您这一切将如何变得更容易。 :)
答案 1 :(得分:4)
chars 中的字符串可以通过使每个字符通过指针CHAR(STRING_ELT(chars, i)
来检索,其中0&lt; = i &lt;长度(字符),并将其存储在s[i]
。
#include <stdlib.h>
#include <Rinternals.h>
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;
}
答案 2 :(得分:2)
根据乔希的要求:
R> pickString <- cppFunction('std::string pickString(std::vector<std::string> invec, int pos) { return invec[pos]; } ')
R> pickString(c("The", "quick", "brown", "fox"), 1)
[1] "quick"
R>
C向量是零偏移,因此1选择第二个元素。