Допустим, у нас есть .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
, как показано здесь, поэтому его необходимо обобщить.Идеальное решение будет работать без жесткого кодирования имен полей в виде столбцов.