Rcpp::DataFrame::create受20个参数的限制?

Rcpp::DataFrame::create受20个参数的限制?,r,rcpp,rcpp11,R,Rcpp,Rcpp11,我们正在Rcpp函数中创建以下数据帧: Rcpp::DataFrame res = Rcpp::DataFrame::create( Rcpp::Named("A")=a ,Rcpp::Named("B")=b ,Rcpp::Named("C")=c ,Rcpp::Named("D")=d ,Rcpp::Named("E")=e ,Rcpp::Named("F")=f ,Rcpp::Named("G")=g ,Rcpp

我们正在Rcpp函数中创建以下数据帧:

  Rcpp::DataFrame res =
    Rcpp::DataFrame::create(
     Rcpp::Named("A")=a
    ,Rcpp::Named("B")=b
    ,Rcpp::Named("C")=c
    ,Rcpp::Named("D")=d
    ,Rcpp::Named("E")=e
    ,Rcpp::Named("F")=f
    ,Rcpp::Named("G")=g
    ,Rcpp::Named("H")=h
    ,Rcpp::Named("I")=i
    ,Rcpp::Named("J")=j
    ,Rcpp::Named("K")=k
    ,Rcpp::Named("L")=l
    ,Rcpp::Named("M")=m
    ,Rcpp::Named("N")=n
    ,Rcpp::Named("O")=o
    ,Rcpp::Named("P")=p
    ,Rcpp::Named("Q")=q
    ,Rcpp::Named("R")=r
    ,Rcpp::Named("S")=s
    ,Rcpp::Named("T")=t
    ,Rcpp::Named("U")=u
  );
此数据帧旨在作为返回的结果。但是,由于以下错误,它无法编译:

error: no matching function for call to Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>::create
In file included from local/lib64/R/library/Rcpp/include/Rcpp/DataFrame.h:97:0,
                 from local/lib64/R/library/Rcpp/include/Rcpp.h:57,
                 from file54f121e6a937.cpp:1:
local/lib64/R/library/Rcpp/include/Rcpp/generated/DataFrame_generated.h:142:23: note: template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20> static Rcpp::DataFrame_Impl<StoragePolicy> Rcpp::DataFrame_Impl<StoragePolicy>::create(const T1&, const T2&, const T3&, const T4&, const T5&, const T6&, const T7&, const T8&, const T9&, const T10&, const T11&, const T12&, const T13&, const T14&, const T15&, const T16&, const T17&, const T18&, const T19&, const T20&) [with T1 = T1; T2 = T2; T3 = T3; T4 = T4; T5 = T5; T6 = T6; T7 = T7; T8 = T8; T9 = T9; T10 = T10; T11 = T11; T12 = T12; T13 = T13; T14 = T14; T15 = T15; T16 = T16; T17 = T17; T18 = T18; T19 = T19; T20 = T20; StoragePolicy = Rcpp::PreserveStorage]
 static DataFrame_Impl create( const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20 ) {
                       ^
local/lib64/R/library/Rcpp/include/Rcpp/generated/DataFrame_generated.h:142:23: note:   template argument deduction/substitution failed:
file54f121e6a937.cpp:771:7: note:   candidate expects 20 arguments, 21 provided
错误:对Rcpp::DataFrame\u Impl::create的调用没有匹配的函数
在本地/lib64/R/library/Rcpp/include/Rcpp/DataFrame.h:97:0中包含的文件中,
从local/lib64/R/library/Rcpp/include/Rcpp.h:57,
来自文件54F121E6A937.cpp:1:
local/lib64/R/library/Rcpp/include/Rcpp/generated/DataFrame\u generated.h:142:23:注意:模板静态Rcpp::DataFrame\u Impl Rcpp::DataFrame\u Impl::create(常数T1&,常数T2&,常数T3&,常数T4&,常数T5&,常数T6&,常数T7&,常数T8&,常数T9&,常数T10&,常数T11&,常数T12&,常数T13&,常数T14&,常数T15&,常数T16&,常数T17&,常数T18&,常数T19&,常数T20&)[T1=T1;T2=T2;T3=T3;T4=T4;T5=T5;T6=T6;T7=T7;T8=T8;T9=T9;T10=T10;T11=T11;T12=T12;T13=T13;T14=T14;T15=T15;T16=T16;T17=T17;T18=T18;T19=T19;T20=T20;StoragePolicy=Rcpp::PreserveStorage]
静态数据帧(常数T1和T1,常数T2和T2,常数T3和T3,常数T4和T4,常数T5和T5,常数T6和T6,常数T7和T7,常数T8和T8,常数T9和T9,常数T10和T10,常数T11和T11,常数T12和T12,常数T13和T13,常数T14和T14,常数T15和T15,常数T16和T16,常数T17和T17,常数T18和T18,常数T10和T19和T19){
^
local/lib64/R/library/Rcpp/include/Rcpp/generated/DataFrame_generated.h:142:23:注意:模板参数推断/替换失败:
file54f121e6a937.cpp:771:7:注意:候选者需要20个参数,提供21个

有20个参数就可以了。我们如何克服这个问题呢?谢谢,是的。这在很多不同的地方都有介绍

不经意间:

本质上,为了能够用最多的编译器编译它,Rcpp受到旧版本的限制 不支持变量函数参数的C++标准,所以我们实际上使用宏和代码生成器脚本 显式枚举参数,并且该数字必须在某个限制处停止。我们选择了20


创建超过20列的
data.frame
的方法是构建
列表
,然后强制到
data.frame

示例代码:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::List dynamic_df(Rcpp::DataFrame df) {

  // Number of variables in data.frame
  int num_vars = df.ncol();

  // Instantiate list with p variable entries
  Rcpp::List long_list(num_vars);

  // Make a variable to name columns
  Rcpp::CharacterVector namevec(num_vars);

  // Copy from data.frame into list.
  for (int i=0;i < num_vars; ++i) {
    long_list[i] = df(i); // Move vector from data frame to list
    namevec[i] = i;
  }

  // Add colnames
  long_list.attr("names") = namevec;

  // Coerce list to data.frame
  long_list.attr("row.names") = Rcpp::IntegerVector::create(NA_INTEGER, df.nrow());
  long_list.attr("class") = "data.frame";

  // Return result.. Will appear as data.frame
  return long_list;
}

/*** R

head(dynamic_df(mtcars))

*/

不过,您应该考虑在重复条目中使用凯文的<代码> ListSubguldE/Cux>类。

c、 f


这本质上是一个常见问题。如果您需要20多个,请将它们嵌套在一个列表对象中,该元素最多使用20列。@Dirk Eddelbuettel。谢谢。Rcpp::list::create是否也有20的限制?如果是,那么上限为20x20=400?这是一个递归数据结构,因此20 x 20 x 20 x 20…@Dirk Eddelbuettel。谢谢。不会是m吗或者用户友好地将其推入Rcpp堆栈,并使宏限制在编译时可由用户参数化(无论如何,用户必须在每次运行时编译代码)。您可以选择c++11作为编译器选项。因此,这应该不会有任何问题。我们需要在旧编译器上支持关键功能。但是,该体系结构是可扩展的,因此您可以轻松地提供一个包,其中包含一个函数,以创建包含所需元素的列表。您能否提供一个示例“构建一个列表,然后强制到data.frame”这样我就可以测试它了?谢谢。@Dimon,请查看更新的响应。谢谢。我想知道这些包装器在时间和数据复制方面有多高效。
head(dynamic_df(mtcars))
#      0 1   2   3    4     5     6 7 8 9 10
# 1 21.0 6 160 110 3.90 2.620 16.46 0 1 4  4
# 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4  4
# 3 22.8 4 108  93 3.85 2.320 18.61 1 1 4  1
# 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3  1
# 5 18.7 8 360 175 3.15 3.440 17.02 0 0 3  2
# 6 18.1 6 225 105 2.76 3.460 20.22 1 0 3  1