假设我们有一个.proto
文件,其中包含有效载荷嵌套:
syntax = "proto3";
package optimize_nesting;
message TestPayload {
int32 a = 1;
int32 b = 2;
}
message NestedPayload {
repeated TestPayload nested = 1;
}
取消嵌套消息的一种方法是使用[[]]
进行子集设置,但这不适用于具有两个以上嵌套字段的情况。另一个可能是:
RProtoBuf::readProtoFiles("reprex.proto")
p <- optimize_nesting.NestedPayload$new(nested = list(
optimize_nesting.TestPayload$new(a = 123,
b = 456),
optimize_nesting.TestPayload$new(a = 000,
b = 999)
))
map_df(p[["nested"]], ~tibble(a = .[["a"]],
b = .[["b"]]))
## using [[]]
tibble(a = c(p$nested[[1]][[1]],
p$nested[[1]][[2]]),
b = c(p$nested[[2]][[1]],
p$nested[[2]][[2]]))
# A tibble: 2 x 2
a b
<dbl> <dbl>
1 123 456
2 0 999
一些基准:
Unit: microseconds
expr min lq mean median
purrr 1014.667 1125.5450 1689.671 1280.791
base 487.676 514.3695 583.3068 532.079
这是从嵌套消息变为可行的小标题的最快方法吗?应该在Rcpp
中完成此操作吗?
请考虑到NestedPayload
可能包含多种类型的消息,而不仅仅是此处所示的TestPayload
,因此需要进行概括。完美的解决方案无需将字段名称硬编码为列即可。