簡體   English   中英

如何在Rcpp中獲取整數行名?

[英]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

我嘗試用兩種不同的方式進行轉換,並遇到不同的編譯錯誤:

嘗試1

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

嘗試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函數atoiconst 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM