R - реагируемый - groupBy - показывать итоги сверху - PullRequest
0 голосов
/ 23 апреля 2020

У меня вопрос по поводу reactable в R. У меня есть сгруппированный df, где были сделаны вычисления сома, например, относительные числа и суммы. Насколько я понимаю, можно сгруппировать reactable, используя встроенные функции max, mean et c. Вместо этого я хотел бы отобразить строки с именем show_top вместо, например, colDef(aggregate = "max").

Я заметил, что вы можете создать свою собственную JS функцию . К сожалению, у меня нет опыта в JS.

colDef(
  aggregate = JS("
    function(values, rows) {
      // input:
      //  - values: an array of all values in the group
      //  - rows: an array of row info objects for all rows in the group
      //
      // output:
      //  - an aggregated value, e.g. a comma-separated list
      return values.join(', ')
    }
  ")
)

Пожалуйста, посмотрите ниже, чего бы я хотел достичь.

reactable(xy, groupBy = "col1")

enter image description here

structure(list(col1 = c("A", "B", "Tot", "A", "A", "A", "B", 
"B", "B", "Tot", "Tot", "Tot"), col2 = c("show_top", "show_top", 
"show_top", "Type1", "Type2", "Type3", "Type1", "Type2", "Type3", 
"Type1", "Type2", "Type3"), inc = c(" 9.4 (38.7%)", "14.9 (61.3%)", 
"24.2 (100%)", " 3.7 (39.5%)", " 3.3 (35%)", " 2.4 (25.5%)", 
" 2.3 (15.2%)", " 4.6 (31%)", " 8.0 (53.8%)", " 6.0 (100%)", 
" 7.9 (100%)", "10.4 (100%)"), out = c(" 6.0 (39.6%)", " 9.1 (60.4%)", 
"15.1 (100%)", " 2.3 (38.7%)", " 2.1 (35.4%)", " 1.6 (25.9%)", 
" 0.7 (7.3%)", " 2.0 (21.5%)", " 6.5 (71.2%)", " 3.0 (100%)", 
" 4.1 (100%)", " 8.1 (100%)"), rel = c(0.638870535709061, 0.61502998385249, 
0.624251237892968, 0.626302127121007, 0.645747052829909, 0.648875413897266, 
0.296450202443903, 0.42683196642126, 0.813283715858821, 0.501288831579585, 
0.517981542096351, 0.775466939167642), rp = c(49.8379387690741, 
59.4422025881411, 55.229126405081, 46.132952162477, 51.5764509819408, 
53.8145905581141, 14.8399070194007, 32.048326903348, 137.425346172314, 
31.3269996331764, 39.887561604669, 105.790396392544)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -12L))

1 Ответ

1 голос
/ 24 апреля 2020

Хотя этого можно добиться с помощью пользовательской агрегатной функции, я думаю, что вместо нее будет проще использовать настраиваемый агрегатный модуль визуализации ячеек: https://glin.github.io/reactable/articles/custom-rendering.html#javascript -render-function

Пользовательские средства визуализации ячеек имеют доступ к дополнительной информации, такой как имя (или идентификатор) столбца. Пользовательские агрегатные функции больше предназначены для простых операций со списком значений в одном столбце.

Вы можете использовать функцию JavaScript для настройки агрегированной ячейки для всех столбцов. Для каждой агрегированной ячейки найдите подстроку, для которой значение col2 равно "show_top". Затем верните значение в этой строке, соответствующее текущему столбцу.

Вот пример:

library(reactable)

reactable(
  xy,
  groupBy = "col1",
  defaultColDef = colDef(
    aggregated = JS("
      function(cellInfo) {
        for (var i = 0; i < cellInfo.subRows.length; i++) {
          var row = cellInfo.subRows[i]
          if (row.col2 === 'show_top') {
            return row[cellInfo.column.id]
          }
        }
      }
    ")
  )
)

enter image description here

The * Свойства 1020 * и cellInfo.column описаны в приведенной выше ссылке, если это поможет.

...