问题描述
我正在开发一个Shiny应用程序,其中 <?PHP
$get_param_one = $_GET['user'];
$get_param_two = $_GET['id'];
echo $get_param_one;
echo $get_param_two;
?>
软件包由于数据的嵌套结构而非常有用。它使我可以折叠和汇总较高级别类别中的行,并且仅在需要时才扩展以显示“子行”。
对于仅1个嵌套级别(例如,制造商内的汽车模型),reactable
中的聚合函数(unique
,count
等)就可以很好地工作。但是,当添加额外级别的嵌套度时,事情就会崩溃,甚至像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")