Rcpp:获取临时对象类型代理的地址,从 CharacterVector 获取子向量
Rcpp: taking address of temporary object type proxy, getting a subvector from a CharacterVector
关于获取子 CharacterVector 的 Rcpp 问题。我制作了一个适用于多个 NumericVectors 的滚动 window 样式函数,但当我包含 CharacterVectors 时无法使用。我每次尝试使用 CharacterVector 时都会收到此错误:"taking address of temporary object type proxy"。
这是导致问题的代码行:
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;
}
我目前在处理 window 函数时遇到了麻烦,因此它除了打印子向量之外什么都不做。在我用计算复杂化之前,我想从 C++ 中获取输入和输出。
感谢您的帮助。非常感谢您的宝贵时间。
您对您认为 Rcpp 应该 支持的东西做出了一些有点大胆的假设。可悲的是,它并不总是以这种方式处理代码和库。
这些 "flexible" subsetters 不是 Rcpp 中最强的,但支持 一些。但是您需要查看实际支持的内容——我只是通过查看 existing 子集测试来提醒自己。最古老的方法之一是通过另一个向量进行索引。因为你总是想要四个元素,我只是创建了一个索引向量...然后添加 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/Whosebug/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>
关于获取子 CharacterVector 的 Rcpp 问题。我制作了一个适用于多个 NumericVectors 的滚动 window 样式函数,但当我包含 CharacterVectors 时无法使用。我每次尝试使用 CharacterVector 时都会收到此错误:"taking address of temporary object type proxy"。
这是导致问题的代码行:
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;
}
我目前在处理 window 函数时遇到了麻烦,因此它除了打印子向量之外什么都不做。在我用计算复杂化之前,我想从 C++ 中获取输入和输出。
感谢您的帮助。非常感谢您的宝贵时间。
您对您认为 Rcpp 应该 支持的东西做出了一些有点大胆的假设。可悲的是,它并不总是以这种方式处理代码和库。
这些 "flexible" subsetters 不是 Rcpp 中最强的,但支持 一些。但是您需要查看实际支持的内容——我只是通过查看 existing 子集测试来提醒自己。最古老的方法之一是通过另一个向量进行索引。因为你总是想要四个元素,我只是创建了一个索引向量...然后添加 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/Whosebug/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>