2013-02-19 13 views
6

मैं आर से सी से एक चरित्र वेक्टर पास करने की कोशिश कर रहा हूं और इसे सी चरित्र सूचक के माध्यम से संदर्भित करता हूं। हालांकि, मुझे नहीं पता कि किस प्रकार का रूपांतरण मैक्रो उपयोग करना है। नीचे मेरी समस्या का वर्णन करने वाला एक छोटा सा परीक्षण है।मैं एक आर चरित्र वेक्टर को एक सी चरित्र सूचक में कैसे परिवर्तित करूं?

फ़ाइल test.c:

#include <Rinternals.h> 

SEXP test(SEXP chars) 
{ 
    char *s; 

    s = CHAR(chars); 
    return R_NilValue; 
} 

फ़ाइल test.R:

> source("test.R") 
Error in eval(expr, envir, enclos) : 
    CHAR() can only be applied to a 'CHARSXP', not a 'character' 

कोई सुराग: आर से

dyn.load("test.so") 

chars <- c("A", "B") 

.Call("test", chars) 

आउटपुट?

उत्तर

4

वर्ण में स्ट्रिंग सूचक CHAR(STRING_ELT(chars, i), जहां 0 < = मैं < लंबाई (वर्ण), और 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; 
} 
6

कैरेक्टर वैक्टर STRSXP हैं। प्रत्येक व्यक्ति तत्व CHARSXP है, तो आप (untested) की तरह कुछ की जरूरत है:

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

Handling Character Data section of Writing R Extensions देखें। डिर्क जल्द ही आपको यह बताने के लिए होगा कि अगर आप सी ++ और आरसीपीपी का उपयोग करते हैं तो यह सब आसान होगा। :)

+0

अभिव्यक्ति 'CHAR (STRING_ELT (वर्ण, 0))' मुझे केवल पहले वर्ण में एक सूचक (केवल चरित्र '\ 0') देता है। सभी पात्रों को यह पता लगाने के लिए कि मुझे पात्रों के माध्यम से पुनरावृत्ति करने की आवश्यकता है (मेरा जवाब देखें)। –

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> 

सी वैक्टर, शून्य ऑफसेट हैं तो 1 की पसंद दूसरा तत्व।

+0

या इससे भी अधिक संक्षेप में: 'cppFunction (' स्ट्रिंग पिकस्ट्रिंग (कैरेक्टर वेक्टर इनवेक, int pos) {वापसी invec [pos];} ')' (cppFunction आपके लिए असाइनमेंट करता है) – hadley

+0

हां, लेकिन ओपी एक सी प्रोग्रामर है इसलिए मैं लगा कि मैं मानक प्रकारों के साथ रहूंगा और हमारा छुपाऊंगा। –

संबंधित मुद्दे