假设我有一个用cfVecCpp
编写的工作函数RCpp
,它接受NumericVector
并返回相同长度的NumericVector
(且行为正常)。当我尝试将其作为DataFrame
元素的循环运行时,我收到错误。
这是我的代码:
#include <Rcpp.h>
#include <algorithm>
using namespace Rcpp;
using namespace std;
//[[Rcpp::export]]
NumericVector cfVecCpp(NumericVector x,int maxfill=-1){
.... // code works fine here
}
//[[Rcpp::export]]
DataFrame cfDFCpp(DataFrame x, int maxfill=-1) {
int nRows=x.nrows();
int nCols=x.size();
DataFrame z;
for (int i=0;i<nCols;i++) {
NumericVector tmp=cfVecCpp(x[i],maxfill);
// tmp.attr("dim")=Dimension(nRows,1);
z[i]=wrap(tmp); // alternative z[i]=tmp;
}
// z.attr("names")=x.attr("names");
return z;
}
cfDFCpp
函数只是尝试遍历x
的列,执行cfVecCpp
操作然后返回输出。
代码编译得很好。但是,当我尝试按如下方式在RStudio中运行代码时:
y<-cfDFCpp(x) # where x is data frame whose all columns are numeric
我收到错误:
Error in cfDFCpp(x) :
attempt to set index 0/0 in SET_VECTOR_ELT
我尝试提供属性(请参阅注释掉的代码//
行),但错误不会消失。可能是什么问题?
我甚至尝试用z[i]=wrap(tmp);
替换z[i]=tmp;
。代码编译很好,但是当我在RStudio
中运行函数时,我得到了相同的错误。
答案 0 :(得分:2)
如果您创建了空数据框z
,则无法设置z[i]
。您需要使用push_back()
功能。请参阅constructing a Data Frame in Rcpp以了解如何构建数据框。
以下是您问题的答案。
#include <Rcpp.h>
#include <algorithm>
using namespace Rcpp;
using namespace std;
//[[Rcpp::export]]
NumericVector cfVecCpp(NumericVector x,int maxfill=-1){
return(x * 2);
}
//[[Rcpp::export]]
DataFrame cfDFCpp(DataFrame x, int maxfill=-1) {
int nCols =x.length();
List zlist(nCols);
for (int i=0;i<nCols;i++) {
zlist[i] =cfVecCpp(x[i],maxfill);
}
zlist.attr("names") = x.attr("names");
DataFrame z(zlist); // convert list to DataFrame
z.attr("row.names") = x.attr("row.names");
return z;
}
然后在成功运行sourceCpp之后在R中执行
> data(freeny)
> tail(freeny, 2)
y lag.quarterly.revenue price.index income.level
1971.5 9.77536 9.74924 4.27839 6.19377
1971.75 9.79424 9.77536 4.27789 6.20030
market.potential
1971.5 13.1625
1971.75 13.1664
> tail(cfDFCpp(freeny), 2)
y lag.quarterly.revenue price.index income.level
1971.5 19.55072 19.49848 8.55678 12.38754
1971.75 19.58848 19.55072 8.55578 12.40060
market.potential
1971.5 26.3250
1971.75 26.3328