12

R から C に文字ベクトルを渡し、C 文字ポインターを介して参照しようとしています。しかし、どの型変換マクロを使えばいいのかわからない。以下は、私の問題を示す小さなテストです。

ファイル test.c:

#include <Rinternals.h>

SEXP test(SEXP chars)
{
   char *s;

   s = CHAR(chars);
   return R_NilValue;
}

ファイル test.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 拡張機能の記述の「文字データの処理」セクションを参照してください。C++ と Rcpp を使用するだけでこれがどのように簡単になるかについて、Dirk がすぐに説明します。:)

于 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 は 2 番目の要素を選択します。

于 2013-02-19T16:52:46.803 に答える