【问题标题】:Rcpp: taking address of temporary object type proxy, getting a subvector from a CharacterVectorRcpp:获取临时对象类型代理的地址,从 CharacterVector 中获取子向量
【发布时间】:2019-01-14 23:36:12
【问题描述】:

关于获取子 CharacterVector 的 Rcpp 问题。我制作了一个可在多个 NumericVectors 上工作的滚动窗口样式函数,但在包含 CharacterVectors 时无法工作。每次尝试使用 CharacterVector 时都会出现此错误:“获取临时对象类型代理的地址”。

这是导致问题的代码行:

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

我是 C++ 新手,因此目前解决方案超出了我的范围。根据我的阅读,问题在于将指针“&”用于两种不同类型的向量,但我不明白如何解决这个问题。有人介意帮我解决这个错误吗?

我阅读了更多内容,现在我有第二个问题。 Rcpp 中的“CharacterVectors”是否被编程为代理?这是我遇到此问题的唯一矢量类型。最好的解决方法是什么?

这是一个完整的例子:

#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++ 中获取输入和输出。

感谢您的帮助。非常感谢您的宝贵时间。

【问题讨论】:

  • 看这张表:teuder.github.io/rcpp4everyone_en/… 看起来 CharacterVector 是 StringVector 的代理......嗯嗯。
  • 然后呢?该评论与问题有什么关系?答案来了……
  • @DirkEddelbuettel 我很好奇这是否是错误的原因。也许我需要选择不同的方法?感谢您的帮助。

标签: rcpp


【解决方案1】:

您对您认为 Rcpp 应该 支持的内容做出了一些大胆的假设。遗憾的是,它并不总是以这种方式处理代码和库。

这些“灵活”的子集不是 Rcpp 中最强大的,但 一些 是受支持的。但是您需要查看实际支持的内容——我只是通过查看现有 子集测试来提醒自己。最古老的方法之一是通过另一个向量进行索引。由于您总是需要四个元素,因此我只需创建一个索引向量...然后将i 添加到它。

修改后的代码(也更正了 IntegerVectorNumericVector 的混淆,并更改了索引):

#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> 

【讨论】:

  • 改变向量ind的长度会改变“窗口大小”? i
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多