Hi all,
I'm having problem with some code I hope you can help illuminate:
I've written some code originally to speed up and R function, but now really
for my own education:
It's supposed to remove all columns of a matrix containing identical values ( a
big one!):
#include <Rcpp.h>
#include <vector>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterMatrix reduce_sequences(CharacterMatrix completeDNA)
{
std::vector<int> informativeSites; // Start vector to record
informative sites I.e columns which are not all identical…
for(int i = 0; i < completeDNA.ncol(); i++) // For each column of the
matrix…
{
CharacterVector bpsite(completeDNA.nrow()); //Make a vector to contain
the column.
for(int n = 0; n < completeDNA.nrow(); n++)
{
bpsite[n] = completeDNA(n,i); // Fill in the vector with the matrix
column.
}
if(any(bpsite != bpsite[0])) informativeSites.push_back(i); //If values
are not all identical, push the column index onto the vector.
}
CharacterMatrix cutDNA(3, informativeSites.size()); //Make new matrix to
contain only all the columns which are not identical.
for(int i = 0; i < informativeSites.size(); i++)
{
for(int n = 0; n < cutDNA.nrow(); n++)
{
cutDNA(n,i) = completeDNA(n,informativeSites[i]); // Use loops to fill
in the new matrix.
}
}
return cutDNA; //Return the new matrix
}
However I seem to be having issues with the line:
if(any(bpsite != bpsite[0])) informativeSites.push_back(i);
I think it is to do with the any() function, the errors are reported from the
header file "SingleLogicalResult.h" and involve contorting bool. At least
that's as far as I can dechiper the errors.
The console output below for full details. Is there a way for me to fix this?
Thanks,
Ben W.
> Rcpp::sourceCpp('reduceseq.cpp')
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/logical/SingleLogicalResult.h:
In instantiation of ‘Rcpp::sugar::conversion_to_bool_is_forbidden<false>’:
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/logical/SingleLogicalResult.h:74:
instantiated from ‘Rcpp::sugar::SingleLogicalResult<NA, T>::operator bool()
[with bool NA = true, T = Rcpp::sugar::Any<true,
Rcpp::sugar::Comparator_With_One_Value<16, Rcpp::sugar::not_equal<16>, true,
Rcpp::Vector<16> > >]’
reduceseq.cpp:17: instantiated from here
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/logical/SingleLogicalResult.h:36:
error: invalid use of incomplete type ‘struct
Rcpp::sugar::forbidden_conversion<false>’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/logical/SingleLogicalResult.h:29:
error: declaration of ‘struct Rcpp::sugar::forbidden_conversion<false>’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/Comparator_With_One_Value.h:
In member function ‘int Rcpp::sugar::Comparator_With_One_Value<RTYPE,
Operator, NA, T>::rhs_is_not_na(int) const [with int RTYPE = 16, Operator =
Rcpp::sugar::not_equal<16>, bool NA = true, T = Rcpp::Vector<16>]’:
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/Comparator_With_One_Value.h:38:
instantiated from ‘Rcpp::sugar::Comparator_With_One_Value<RTYPE, Operator,
NA, T>::Comparator_With_One_Value(const Rcpp::VectorBase<RTYPE, LHS_NA,
LHS_T>&, typename Rcpp::traits::storage_type<RTYPE>::type) [with int RTYPE =
16, Operator = Rcpp::sugar::not_equal<16>, bool NA = true, T =
Rcpp::Vector<16>]’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/logical_operators__Vector__primitive.h:266:
instantiated from ‘Rcpp::sugar::Comparator_With_One_Value<RTYPE,
Rcpp::sugar::not_equal<RTYPE>, NA, T> operator!=(const Rcpp::VectorBase<RTYPE,
NA, VECTOR>&, typename Rcpp::traits::storage_type<RTYPE>::type) [with int RTYPE
= 16, bool NA = true, T = Rcpp::Vector<16>]’
reduceseq.cpp:17: instantiated from here
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/Comparator_With_One_Value.h:59:
error: operands to ?: have different types ‘SEXPREC*’ and ‘int’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/Comparator_With_One_Value.h:
In member function ‘int Rcpp::sugar::Comparator_With_One_Value<RTYPE,
Operator, NA, T>::rhs_is_na(int) const [with int RTYPE = 16, Operator =
Rcpp::sugar::not_equal<16>, bool NA = true, T = Rcpp::Vector<16>]’:
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/Comparator_With_One_Value.h:38:
instantiated from ‘Rcpp::sugar::Comparator_With_One_Value<RTYPE, Operator,
NA, T>::Comparator_With_One_Value(const Rcpp::VectorBase<RTYPE, LHS_NA,
LHS_T>&, typename Rcpp::traits::storage_type<RTYPE>::type) [with int RTYPE =
16, Operator = Rcpp::sugar::not_equal<16>, bool NA = true, T =
Rcpp::Vector<16>]’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/logical_operators__Vector__primitive.h:266:
instantiated from ‘Rcpp::sugar::Comparator_With_One_Value<RTYPE,
Rcpp::sugar::not_equal<RTYPE>, NA, T> operator!=(const Rcpp::VectorBase<RTYPE,
NA, VECTOR>&, typename Rcpp::traits::storage_type<RTYPE>::type) [with int RTYPE
= 16, bool NA = true, T = Rcpp::Vector<16>]’
reduceseq.cpp:17: instantiated from here
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/sugar/operators/Comparator_With_One_Value.h:56:
error: invalid conversion from ‘SEXPREC* const’ to ‘int’
make: *** [reduceseq.o] Error 1
g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include
-I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG
-I/usr/local/include
-I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include"
-fPIC -g -O2 -c reduceseq.cpp -o reduceseq.o
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel