[英]How to get integer rownames in Rcpp?
在這兩個職位上工作
1. 在C和C ++中將char轉換為int
2. http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2010-July/000932.html
我正在嘗試從Rcpp
矩陣(NumericMatrix等)中獲取行名作為IntegerVector。
在R中,這將是:
as.integer(rownames(x)) # where x is a matrix
我嘗試用兩種不同的方式進行轉換,並遇到不同的編譯錯誤:
cppFunction('IntegerVector rownames1(NumericMatrix x) {
List dimnames = x.attr("dimnames");
CharacterVector rownames = dimnames[0];
IntegerVector out(dimnames.size());
for (int i= 0; i < out.size(); i++) {
out[i] = (int) rownames[i]; // cast via (int)
}
return (IntegerVector) dimnames[0];}')
file1b9c6dec3c12.cpp:在函數'Rcpp :: IntegerVector rownames1(Rcpp :: NumericMatrix)':file1b9c6dec3c12.cpp:11:40:錯誤:類型'Rcpp :: Vector <16> :: Proxy {aka Rcpp ::: internal :: string_proxy <16>}'鍵入'int'make:*** [file1b9c6dec3c12.o]錯誤1警告消息:運行命令'make -f“ C:/PROGRA~1/R/R-32~1.2 / etc / x64 / Makeconf“ -f” C:/PROGRA~1/R/R-32~1.2/share/make/winshlib.mk“ SHLIB_LDFLAGS ='$(SHLIB_CXXLDFLAGS)'SHLIB_LD ='$(SHLIB_CXXLD)'SHLIB =“ sourceCpp_23.dll” WIN = 64 TCLBIN = 64 OBJECTS =“ file1b9c6dec3c12.o”'狀態為2
cppFunction('IntegerVector rownames1(NumericMatrix x) {
List dimnames = x.attr("dimnames");
CharacterVector rownames = dimnames[0];
IntegerVector out(dimnames.size());
for (int i= 0; i < out.size(); i++) {
out[i] = rownames[i] + "0"; // cast as suggested in SO post linked above
}
return (IntegerVector) dimnames[0];}')
file1b9c71d25b92.cpp:在函數'Rcpp :: IntegerVector rownames1(Rcpp :: NumericMatrix)'中:file1b9c71d25b92.cpp:11:38:錯誤:'Rcpp :: Vector :: operator中'operator-'的重載[帶有int RTYPE = 16,StoragePolicy = Rcpp :: PreserveStorage,Rcpp :: Vector :: Proxy = Rcpp :: internal :: string_proxy <16>,R_xlen_t = long long int]((((long long int)i))-“ 0” file1b9c71d25b92.cpp:11:38:注意:候選對象是:file1b9c71d25b92.cpp:11:38:注意:operator-(const char *,const char *)file1b9c71d25b92.cpp:11:38:note:operator-(const char * ,const char *)file1b9c71d25b92.cpp:11:38:注意:operator-(char *,char *)make:*** [file1b9c71d25b92.o]錯誤1警告消息:運行命令'make -f“ C:/ PROGRA 〜1 / R / R-32〜1.2 / etc / x64 / Makeconf“ -f” C:/PROGRA~1/R/R-32~1.2/share/make/winshlib.mk“ SHLIB_LDFLAGS ='$(SHLIB_CXXLDFLAGS) 'SHLIB_LD ='$(SHLIB_CXXLD)'SHLIB =“ sourceCpp_21.dll” WIN = 64 TCLBIN = 64 OBJECTS =“ file1b9c71d25b92.o”'的狀態為2
任何幫助表示贊賞!
您可以使用cstdlib
函數atoi
將const char*
轉換為int
。 例如,
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::IntegerVector rownames1(Rcpp::NumericMatrix x) {
Rcpp::List dimnames = x.attr("dimnames");
Rcpp::CharacterVector rownames = dimnames[0];
Rcpp::IntegerVector out(rownames.size());
std::transform(rownames.begin(), rownames.end(), out.begin(), std::atoi);
return out;
}
/*** R
M <- matrix(
1.5:16.5, nrow = 4,
dimnames = list(1:4, 1:4))
##
R> all.equal(rownames1(M), as.integer(row.names(M)))
#[1] TRUE
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.