如何正确聚合R中的嵌套行与reactable?

问题描述

我正在开发一个Shiny应用程序,其中 <?PHP $get_param_one = $_GET['user']; $get_param_two = $_GET['id']; echo $get_param_one; echo $get_param_two; ?> 软件包由于数据的嵌套结构而非常有用。它使我可以折叠和汇总较高级别类别中的行,并且仅在需要时才扩展以显示“子行”。

对于仅1个嵌套级别(例如,制造商内的汽车模型),reactable中的聚合函数uniquecount等)就可以很好地工作。但是,当添加额外级别的嵌套度时,事情就会崩溃,甚至像reactable这样的聚合器也会出现重复的值(!)。我怀疑这是因为子类别不是全部集中在一个平面结构中,而只对它们执行了一个聚合步骤,而是唯一的值仍然是子类别特定的,然后才被串联在一起,导致重复。此问题也会影响其他聚合器,而不仅仅是unique

我正在R中的下方添加MWE,因为我无法解决此问题。由于JS也不是我的强项,因此我无法插入任何JS来更灵活地解决此问题,这是here建议的。如何调整下面的聚合器以获得正确显示输出(即无重复)?

unique

解决方法

我认为可以通过使用聚合器来解决此问题,就像您现在正在使用它们一样,然后通过aggregated的{​​{1}}参数提供自定义JavaScript渲染器。这个想法是colDef将通过内置的运算符进行聚合,并将使用自定义渲染器在聚合的单元中渲染输出。

自定义JavaScript渲染器应采用类似于reactable的字符串,并进行一些字符串操作以产生类似于0,0(2),1(6),1(2)的输出。

如果已定义JavaScript函数并将其保存在R变量中,则可以重新使用它:

0(3),1(8)

然后您可以像下面这样将渲染结果提供给jsRenderer <- " function(cellInfo) { const handleBrackets = (item) => { const currentName = item.replace(/\\([0-9]+\\)/g,'') const currentCountsArr = item.match(/\\(([0-9]+)\\)/) let currentCount = 1 if (currentCountsArr && currentCountsArr.length === 2) { currentCount = parseInt(currentCountsArr[1],10) } return { currentName,currentCount } } const getCounts = (input) => { const trimmedInput = input.replace(/\\s+/g,'') const items = trimmedInput.split(',') const namesWithoutBrackets = trimmedInput.replace(/\\(([0-9]+)\\)/g,'').split(',') const itemObj = items.reduce((prev,current,index) => { const itemWithoutBrackets = handleBrackets(current) let { currentName,currentCount } = itemWithoutBrackets if (namesWithoutBrackets.indexOf(currentName) !== index) { currentCount += prev[currentName] } return { ...prev,...{ [currentName]: currentCount } } },{}) const stringToSanitize = Object.entries(itemObj).reduce((prevString,currentKeyValue) => { return prevString.concat(`${currentKeyValue[0]}(${currentKeyValue[1]}),`) },'') return stringToSanitize.slice(0,-2) } return (getCounts(cellInfo.value)) } "

colDef

在您的MWE中,结果显示如下:

colDef(name = "Transmission",aggregate = "frequency",aggregated = jsRenderer)
,

要获取0(3),1(8),您需要

groupBy = c("cyl","am")

output