第一次尝试在 Rcpp 中使用 R 函数时出错
Have error in trying to use R function in Rcpp for the first time
尝试在 Rcpp 中编译一个函数,该函数引入了一个名为 read_excel 的 R 包。
不确定错误是什么意思,但可能找不到包中的函数?
cppFunction('IntegerVector readYear(CharacterVector filePath ) {
IntegerVector Year(filePath.size());
int n=filePath.size();
Environment pkg = Environment::namespace_env("readxl");
Function read_excel=pkg["read_excel"];
for( int i =0 ; i<n; i++){
Year[i] = read_excel(Named("path") = filePath[i],
_["range"] = "B3:B3",
_["col_names"] = false );
}
return Year;
}')
错误信息:
file391220cd2e2.cpp: In function ‘Rcpp::IntegerVector readYear(Rcpp::CharacterVector)’:
file391220cd2e2.cpp:18:22: error: invalid conversion from ‘SEXP {aka SEXPREC*}’ to ‘Rcpp::traits::storage_type<13>::type {aka int}’ [-fpermissive]
Year[i] = read_excel(Named("path") = filePath[i],
^
make: *** [file391220cd2e2.o] Error 1
g++ -std=gnu++11 -I"/opt/R/3.6.0/lib/R/include" -DNDEBUG -I"/home/rstudio-user/R/x86_64-pc-linux-gnu-library/3.6/Rcpp/include" -I"/tmp/RtmpbaxzNs/sourceCpp-x86_64-pc-linux-gnu-1.0.2" -I/usr/local/include -fpic -g -O2 -c file391220cd2e2.cpp -o file391220cd2e2.o
/opt/R/3.6.0/lib/R/etc/Makeconf:176: recipe for target 'file391220cd2e2.o' failed
Error in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir, :
Error 1 occurred building shared library.
该错误消息表示无法直接将 R 函数的 return 类型(SEXP
)转换为 IntegerVector
的存储类型(int
).您可以使用 Rcpp::as<int>(...)
:
指示 Rcpp
这样做
Rcpp::cppFunction('IntegerVector readYear(CharacterVector filePath ) {
int n = filePath.size();
IntegerVector Year(n);
Environment pkg = Environment::namespace_env("readxl");
Function read_excel=pkg["read_excel"];
for(int i =0; i<n; ++i){
Year[i] = Rcpp::as<int>(read_excel(_("path") = filePath[i],
_["range"] = "B3:B3",
_["col_names"] = false ));
}
return Year;
}')
顺便说一句,我希望在 C++ 中这样做有充分的理由,因为它实际上比等效的 R 函数慢,因为从 C++ 调用 R 函数是有代价的。
尝试在 Rcpp 中编译一个函数,该函数引入了一个名为 read_excel 的 R 包。
不确定错误是什么意思,但可能找不到包中的函数?
cppFunction('IntegerVector readYear(CharacterVector filePath ) {
IntegerVector Year(filePath.size());
int n=filePath.size();
Environment pkg = Environment::namespace_env("readxl");
Function read_excel=pkg["read_excel"];
for( int i =0 ; i<n; i++){
Year[i] = read_excel(Named("path") = filePath[i],
_["range"] = "B3:B3",
_["col_names"] = false );
}
return Year;
}')
错误信息:
file391220cd2e2.cpp: In function ‘Rcpp::IntegerVector readYear(Rcpp::CharacterVector)’:
file391220cd2e2.cpp:18:22: error: invalid conversion from ‘SEXP {aka SEXPREC*}’ to ‘Rcpp::traits::storage_type<13>::type {aka int}’ [-fpermissive]
Year[i] = read_excel(Named("path") = filePath[i],
^
make: *** [file391220cd2e2.o] Error 1
g++ -std=gnu++11 -I"/opt/R/3.6.0/lib/R/include" -DNDEBUG -I"/home/rstudio-user/R/x86_64-pc-linux-gnu-library/3.6/Rcpp/include" -I"/tmp/RtmpbaxzNs/sourceCpp-x86_64-pc-linux-gnu-1.0.2" -I/usr/local/include -fpic -g -O2 -c file391220cd2e2.cpp -o file391220cd2e2.o
/opt/R/3.6.0/lib/R/etc/Makeconf:176: recipe for target 'file391220cd2e2.o' failed
Error in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir, :
Error 1 occurred building shared library.
该错误消息表示无法直接将 R 函数的 return 类型(SEXP
)转换为 IntegerVector
的存储类型(int
).您可以使用 Rcpp::as<int>(...)
:
Rcpp
这样做
Rcpp::cppFunction('IntegerVector readYear(CharacterVector filePath ) {
int n = filePath.size();
IntegerVector Year(n);
Environment pkg = Environment::namespace_env("readxl");
Function read_excel=pkg["read_excel"];
for(int i =0; i<n; ++i){
Year[i] = Rcpp::as<int>(read_excel(_("path") = filePath[i],
_["range"] = "B3:B3",
_["col_names"] = false ));
}
return Year;
}')
顺便说一句,我希望在 C++ 中这样做有充分的理由,因为它实际上比等效的 R 函数慢,因为从 C++ 调用 R 函数是有代价的。