gpt4 book ai didi

rcpp - 在 DataFrame::create( vec1, vec2 ... ) 中可以添加多少个向量?

转载 作者:行者123 更新时间:2023-12-01 08:56:29 26 4
gpt4 key购买 nike

我正在创建一个 DataFrame 来保存已解析的 haproxy http 日志文件,其中包含很多字段 (25+)。

如果我添加超过 20 个向量(每个字段一个),我会收到编译错误:

no matching function call to 'create'

创建方法:

    return DataFrame::create(
_["clientIp"] = clientIp,
_["clientPort"] = clientPort,
_["acceptDate"] = acceptDate,
_["frontendName"] = frontendName,
_["backendName"] = backendName,
_["serverName"] = serverName,
_["tq"] = tq,
_["tw"] = tw,
_["tc"] = tc,
_["tr"] = tr,
_["tt"] = tt,
_["status_code"] = statusCode,
_["bytes_read"] = bytesRead,

#if CAPTURED_REQUEST_COOKIE_FIELD == 1
_["capturedRequestCookie"] = capturedRequestCookie,
#endif

#if CAPTURED_REQUEST_COOKIE_FIELD == 1
_["capturedResponseCookie"] = capturedResponseCookie,
#endif

_["terminationState"] = terminationState,
_["actconn"] = actconn,
_["feconn"] = feconn,
_["beconn"] = beconn,
_["srv_conn"] = srvConn,
_["retries"] = retries,
_["serverQueue"] = serverQueue,
_["backendQueue"] = backendQueue
);

问题:

  1. 我是否达到了硬性限制?
  2. 是否有一种解决方法可以让我向数据框添加 20 多个向量?

最佳答案

是的,您已经达到了硬性限制——Rcpp 受到 C++98 标准的限制,该标准需要显式代码膨胀来支持“可变参数”参数。本质上,必须为每个使用的 create 函数生成一个新的重载,并且为了避免阻塞编译器,Rcpp 只提供了最多 20 个。

一种解决方法是使用“builder”类,您可以在其中连续添加元素,然后在最后转换为 DataFrame。此类的一个简单示例——我们创建一个 ListBuilder 对象,我们为该对象连续 add 新列。尝试使用此文件运行 Rcpp::sourceCpp() 以查看输出。

#include <Rcpp.h>
using namespace Rcpp;

class ListBuilder {

public:

ListBuilder() {};
~ListBuilder() {};

inline ListBuilder& add(std::string const& name, SEXP x) {
names.push_back(name);

// NOTE: we need to protect the SEXPs we pass in; there is
// probably a nicer way to handle this but ...
elements.push_back(PROTECT(x));

return *this;
}

inline operator List() const {
List result(elements.size());
for (size_t i = 0; i < elements.size(); ++i) {
result[i] = elements[i];
}
result.attr("names") = wrap(names);
UNPROTECT(elements.size());
return result;
}

inline operator DataFrame() const {
List result = static_cast<List>(*this);
result.attr("class") = "data.frame";
result.attr("row.names") = IntegerVector::create(NA_INTEGER, XLENGTH(elements[0]));
return result;
}

private:

std::vector<std::string> names;
std::vector<SEXP> elements;

ListBuilder(ListBuilder const&) {}; // not safe to copy

};

// [[Rcpp::export]]
DataFrame test_builder(SEXP x, SEXP y, SEXP z) {
return ListBuilder()
.add("foo", x)
.add("bar", y)
.add("baz", z);
}

/*** R
test_builder(1:5, letters[1:5], rnorm(5))
*/

PS:与 Rcpp11 ,我们有可变参数函数,因此限制被消除了。

关于rcpp - 在 DataFrame::create( vec1, vec2 ... ) 中可以添加多少个向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com