다된 줄 알고 자신있게 여러 함수중의 하나를 돌려봤는데, 않돈다. 에러도 한참 길고.....
#Orignial C++ Code
double FindHigh3(Prices[], long t_begin, long t_end) {
double high=Prices[t_begin];
for(long t=t_begin+1; t<=t_end; t++) {
if(Prices[t]>high) {
high=Prices[t];
}
}
return high;
}
#cppFunction
> cppFunction('
+ double FindHigh3(Prices[], long t_begin, long t_end) {
+ double high=Prices[t_begin];
+ for(long t=t_begin+1; t<=t_end; t++) {
+ if(Prices[t]>high) {
+ high=Prices[t];
+ }
+ }
+ return high;
+ }', showOutput =TRUE)
C:/PROGRA~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o "sourceCpp_96750.dll" "filed5c231e7900.cpp"
g++ -m64 -I"C:/PROGRA~1/R/R-31~1.0/include" -DNDEBUG -I"C:/Users/user/Documents/R/win-library/3.1/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include" -O2 -Wall -mtune=core2 -c filed5c231e7900.cpp -o filed5c231e7900.o
filed5c231e7900.cpp:7:18: error: 'Prices' was not declared in this scope
filed5c231e7900.cpp:7:25: error: expected primary-expression before ']' token
filed5c231e7900.cpp:7:28: error: expected primary-expression before 'long'
filed5c231e7900.cpp:7:42: error: expected primary-expression before 'long'
filed5c231e7900.cpp:7:52: error: expression list treated as compound expression in initializer [-fpermissive]
filed5c231e7900.cpp:7:54: error: expected ',' or ';' before '{' token
make: *** [filed5c231e7900.o] Error 1
Warning message:
running command 'make -f "C:/PROGRA~1/R/R-31~1.0/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-31~1.0/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_96750.dll" WIN=64 TCLBIN=64 OBJECTS="filed5c231e7900.o"' had status 2
Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput, :
Error 1 occurred building shared library.
In addition: Warning message:
Invalid parameter: 'Prices[]' for Rcpp::export attribute at filed5c231e7900.cpp:5
>
> Prices=rnorm(100)
> t_begin=5
> t_end=10
> FindHigh3(Prices,t_begin,t_end)
Error: could not find function "FindHigh3"
>
#soueceCpp() function
학교에서 링크로 소개한 자료들을 수백장 프린트해서 마구 읽은 결과 Prices[]에 문제가 있을 것 같은 생각이 들어 이를
NumericVector Prices로 고치니 돌아간다.
> cppFunction('
+ double FindHigh(NumericVector Prices, long t_begin, long t_end) {
+ double high=Prices[t_begin];
+ for(long t=t_begin+1; t<=t_end; t++) {
+ if(Prices[t]>high) {
+ high=Prices[t];
+ }
+ }
+ return high;
+ }', showOutput =TRUE)
>
> Prices=rnorm(100)
> t_begin=5
> t_end=10
> FindHigh(Prices,t_begin,t_end)
[1] -0.1424473
그리고 코드가 길어 질 것같아, 코드를 저장해놓고 한줄로 부를 수 있는 기능 (함수의 source()처럼) 을 찾았다. sourceCpp()
sourceCpp(code='
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double FindHigh2(NumericVector Prices, long t_begin, long t_end) {
double high=Prices[t_begin];
for(long t=t_begin+1; t<=t_end; t++) {
if(Prices[t]>high) {
high=Prices[t];
}
}
return high;
}'
)
FindHigh2(Prices,t_begin,t_end)
cppFunction()과 똑 같아 보이지만 파란부분은 c++에서 cpp파일로 저장을 해야하는 부분이다. 구리고 다음과 같이 사용하면 코드가 짧아진다.
sourceCpp("C:\\Users\\user\\Dropbox\\Jase\\Technical Indicators\\R_CPP_STW_2014\\FindHigh.cpp")
FindHigh(Prices,t_begin,t_end)
[1] -0.1424473
어제 반나절을 스트레스 받으며 공부한건데 이글을 있는 사람은 너무 쉽게 난관을 극복할 것 같다.