2013-12-11 53 views
1

我正在嘗試從R調用C++代碼。我已經安裝了軟件包Rtools和Rcpp。我爲g ++設置了2個環境變量。使用Rcpp從R發生錯誤

但是當我運行這段代碼:

library(inline) 
library(Rcpp) 
src <- ' 
    std::vector<std::string> s; 
    s.push_back("hello"); 
    s.push_back("world"); 
    return Rcpp::wrap(s); 
' 
hellofun <- cxxfunction(body = src, includes = '', plugin = 'Rcpp', verbose = FALSE) 
cat(hellofun(), '\n') 

我得到:

Error in compileCode(f, code, language = language, verbose = verbose) : 
    Compilation ERROR, function(s)/method(s) not created! 
> cat(hellofun(), '\n') 
Error in cat(hellofun(), "\n") : could not find function "hellofun" 

雖然,G ++檢測:

> system('g++ -v') 
Using built-in specs. 
COLLECT_GCC=C:\Rtools\GCC-46~1.3\bin\G__~1.EXE 
COLLECT_LTO_WRAPPER=c:/rtools/gcc-46~1.3/bin/../libexec/gcc/i686-w64-mingw32/4.6.3/lto-wrapper.exe 
Target: i686-w64-mingw32 
Configured with: /data/gannet/ripley/Sources/mingw-test3/src/gcc/configure --host=i686-w64-mingw32 --build=x86_64-linux-gnu --target=i686-w64-mingw32 --with-sysroot=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/mingw32 --prefix=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/mingw32 --with-gmp=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --with-mpfr=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --with-mpc=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --disable-shared --enable-static --enable-targets=all --enable-languages=c,c++,fortran --enable-libgomp --enable-sjlj-exceptions --enable-fully-dynamic-string --disable-nls --disable-werror --enable-checking=release --disable-win32-registry --disable-rpath --disable-werror CFLAGS='-O2 -mtune=core2 -fomit-frame-pointer' LDFLAGS= 
Thread model: win32 
gcc version 4.6.3 20111208 (prerelease) (GCC) 

什麼問題?

+3

可能是冗長設置爲TRUE,以獲取有關什麼地方出了錯更多有用的信息。另外,從內聯使用'cxxfunction'是一種古老的方式。現在,我們使用更好的'cppFunction'或'sourceCpp'。 –

+0

你的代碼的複製/粘貼在'W7_64''R版本3.0.1(2013-05-16)','Rcpp'0.10.4''上適用(是的,是的,我知道我在後面!) 。有關您的設置的更多信息將是必需的。 ('sessionInfo()'等)。 –

+0

我在這裏找到了這個例子(https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started)。我的目標是使用Rstan,但它基於Rcpp。你能告訴我如何設置詳細模式嗎? –

回答

0

使用cppFunction,這適用於例如:

library(inline) 
library(Rcpp) 
src <- ' 
SEXP hellofun(){ 
std::vector<std::string> s; 
    s.push_back("hello"); 
s.push_back("world"); 
return Rcpp::wrap(s); 
}' 
hello_fun <- cppFunction(src) 

hello_fun() 
[1] "hello" "world" 
+0

當我嘗試你的代碼,我得到以下錯誤: MAKE 5.2版版權所有(C)1987,2000 Borland公司 錯誤sourceCpp(代碼=代碼,ENV = ENV,重建=重建,showOutput = showOutput,:發生 錯誤建立共享庫 –

+1

所以你讓Borland在Rtools之前的Rtools之前在你的PATH中做出了那個,沒有,沒有,工作 –

+0

好吧,在把所有其他的路徑放在其他路徑之前,它工作了!運行rstan(失敗),行cppFunction(src)不再編譯...錯誤太長,無法在註釋中報告。 –