我已经使用 Rcpp 和 C++ 为 R 编写了一些代码,以尝试更加熟悉它:
#include <Rcpp.h>
#include <vector>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterMatrix reduce_sequences(CharacterMatrix completeDNA)
{
std::vector<int> informativeSites;
for(int i = 0; i < completeDNA.ncol(); i++)
{
CharacterVector bpsite(completeDNA.nrow());
for(int n = 0; n < completeDNA.nrow(); n++)
{
bpsite[n] = completeDNA(n,i);
}
if(any(bpsite != bpsite[0]).is_true()) informativeSites.push_back(i);
}
CharacterMatrix cutDNA(3, informativeSites.size());
for(int i = 0; i < informativeSites.size(); i++)
{
for(int n = 0; n < cutDNA.nrow(); n++)
{
cutDNA(n,i) = completeDNA(n,informativeSites[i]);
}
}
return cutDNA;
}
但是我得到了一个复杂的错误,但不是来 self 的源文件,而是来自 Comparator_With_One_Value.h:
我不会假装完全理解这些错误,因为我仍处于 C++ 初级阶段,但通过适本地注释掉我的代码并找到导致错误的原因,这是我的第 17 行:
if(any(bpsite != bpsite[0]).is_true()) informativeSites.push_back(i);
我认为这与我使用 any() 有关。我做错了什么?
编辑:更改了行以反射(reflect)上述所有已解决的问题,除了两个: 控制台输出:
Error in Rcpp::sourceCpp("reduceseq.cpp") :
Error 1 occurred building shared library.
从 Comparator_With_One_Value.h 返回的问题
操作数 ?: 有不同的类型 'SEXPREC*' 和 'int'
和
从“SEXPREC* const”到“int”的无效转换
谢谢, 本。
最佳答案
我们故意阻止这种情况,因为 R
中的 3 个逻辑值:TRUE
、FALSE
、NA
.您应该能够像这样使用 is_true
:
if(any(bpsite != bpsite[0]).is_true()) informativeSites.push_back(i);
关于c++ - sugar all() 行的 Rcpp 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16558690/