Rcpp: получение адреса временного прокси типа объекта, получение подвектора из CharacterVector - PullRequest
0 голосов
/ 15 января 2019

Rcpp вопрос о получении sub CharacterVector. Я сделал функцию стиля скользящего окна, которая работает на нескольких NumericVectors, но не работает, когда я включаю CharacterVectors. Я получаю эту ошибку каждый раз, когда пытаюсь использовать CharacterVector: «получение адреса временного прокси типа объекта».

Это строка кода, которая вызывает проблему:

  CharacterVector subchrom (&chrom[i], &chrom[i+4]);

Я новичок в C ++, и, таким образом, решение на данный момент мне недоступно. Из того, что я прочитал, проблема заключается в использовании указателя «&» для двух разных типов векторов, но я не понимаю, как это исправить. Кто-нибудь возражал бы мне помочь решить эту ошибку?

Я немного почитал, и теперь у меня второй вопрос. "CharacterVectors" в Rcpp запрограммированы как прокси? Это единственный тип вектора, с которым у меня возникла эта проблема. Какой лучший обходной путь?

Вот полный пример:

#example data for R   
start <- c(0, 2, 4, 6, 8, 10)
chrom <- c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1")

df <- data.frame(start, chrom)

Это программа .cpp Rcpp:

#include <algorithm>
#include <Rcpp.h>
#include <vector>

using namespace Rcpp;

// [[Rcpp::export]]
List modifyDataFrame2(DataFrame df) {

  // access the columns
  CharacterVector chrom = df["chrom"];
  IntegerVector start = df["start"];


  List Out = List::create();

  // write the for loop     
  for(int i=0; i < df.nrow(); ++i){

  NumericVector substart (&start[i], &start[i+4]);
  CharacterVector subchrom (&chrom[i], &chrom[i+4]);

  Rcout << "substart is:" <<substart << "\n";
  Rcout << "subchrom is:" <<subchrom << "\n";

  List temp = List::create(subchrom, substart);
  Out.push_back(temp);

  }
  return Out;
}

В данный момент у меня проблемы со съемкой оконной функции, поэтому она ничего не делает, кроме печати субвекторов. Я хочу набрать свой ввод и вывод из c ++ до того, как усложню вычисления.

Спасибо за вашу помощь. Я очень ценю ваше время.

1 Ответ

0 голосов
/ 15 января 2019

Вы делаете несколько героические предположения о том, что Rcpp должен поддерживать. К сожалению, это не всегда работает с кодом и библиотеками.

Эти "гибкие" подмножества не самые сильные из Rcpp, но поддерживаются некоторые . Но вам нужно взглянуть на то, что на самом деле поддерживается - я просто напомнил себе, посмотрев существующих тестов для поднабора. И одним из самых старых методов является индексация другим вектором. Поскольку вам всегда нужны четыре элемента, я просто создаю индексный вектор ... и затем добавляю i к нему.

Измененный код (также исправлено при путанице IntegerVector до NumericVector и изменении индексации):

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List modifyDataFrame2(DataFrame df) {

  // access the columns
  CharacterVector chrom = df["chrom"];
  IntegerVector start = df["start"];

  List Out;
  IntegerVector ind = IntegerVector::create(0,1,2,3);

  // write the for loop
  for(int i=0; i < df.nrow()-3; ++i){
    IntegerVector currind = ind + i;
    IntegerVector substart = start[currind];
    CharacterVector subchrom = chrom[currind];

    Rcout << "substart is:" << substart << "\n";
    Rcout << "subchrom is:" << subchrom << "\n";
    List temp = List::create(subchrom, substart);
    Out.push_back(temp);
  }
  return Out;
}

/*** R
#example data for R
start <- c(0, 2, 4, 6, 8, 10)
chrom <- c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1")
df <- data.frame(start, chrom)
modifyDataFrame2(df)
*/

И когда я sourceCpp() это мы получаем следующее:

R> Rcpp::sourceCpp("~/git/stackoverflow/54190760/answer.cpp")

R> #example data for R
R> start <- c(0, 2, 4, 6, 8, 10)

R> chrom <- c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1")

R> df <- data.frame(start, chrom)

R> modifyDataFrame2(df)
substart is:0 2 4 6
subchrom is:"chr1" "chr1" "chr1" "chr1"
substart is:2 4 6 8
subchrom is:"chr1" "chr1" "chr1" "chr1"
substart is:4 6 8 10
subchrom is:"chr1" "chr1" "chr1" "chr1"
[[1]]
[[1]][[1]]
[1] "chr1" "chr1" "chr1" "chr1"

[[1]][[2]]
[1] 0 2 4 6


[[2]]
[[2]][[1]]
[1] "chr1" "chr1" "chr1" "chr1"

[[2]][[2]]
[1] 2 4 6 8


[[3]]
[[3]][[1]]
[1] "chr1" "chr1" "chr1" "chr1"

[[3]][[2]]
[1]  4  6  8 10


R> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...