12

我正在尝试将字符向量从 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'

有什么线索吗?

4

3 回答 3

10

字符向量是STRSXP。每个单独的元素都是CHARSXP,所以你需要类似(未经测试)的东西:

const char *s;
s = CHAR(STRING_ELT(chars, 0));

请参阅编写 R 扩展的处理字符数据部分。Dirk 很快就会告诉你,如果你只使用 C++ 和 Rcpp,这一切会变得更容易。:)

于 2013-02-19T16:17:51.573 回答
7

chars中的字符串可以通过指针获取每个字符CHAR(STRING_ELT(chars, i)),其中 0 <= i < length(chars),并将其存储在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;
}
于 2013-02-20T09:58:26.650 回答
3

根据乔希的要求:

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 选择第二个元素。

于 2013-02-19T16:52:46.803 回答