【问题标题】:Calculating cumulative values from selected rows in DT从 DT 中的选定行计算累积值
【发布时间】:2018-06-09 10:30:43
【问题描述】:

我希望能够从 DT 中选择几行,并在 flexdashboard 仪表中表示列值的累积百分比。我需要从选定的行中调用,因为我计划将其与 crosstalk 一起使用,其中行将从散点图或地图中选择。

这个玩具示例允许我生​​成一个 DT,我可以在其中单击第 2-10 行,打印的 selectedRow() 将显示 Petal.width 列的累积总和,而仪表将按照我的方式呈现总和想要它。

library(shiny)
library(DT)
library(flexdashboard)
shinyApp(
  ui = fluidPage(
    textOutput('list'),
    DTOutput('table'),
    flexdashboard::gaugeOutput("plt1")
  ),
  server = function(input, output, session) {

    iris2<-iris %>% mutate(perc=round((Petal.Width/sum(Petal.Width))*100,1))

    selectedRow <- eventReactive(input$table_rows_selected,{
      selrow<-cumsum(iris2$perc)[c(input$table_rows_selected)]
      tail(selrow, n=1)
    })

    output$plt1 <- flexdashboard::renderGauge({
      gauge(selectedRow(), min = 0, max = 100, symbol = '%', gaugeSectors(
        success = c(80, 100), warning = c(40, 79), danger = c(0, 39)))
    })

    output$list<-renderText({
      selectedRow()
    })

    output$table <- renderDT({iris2})

  }
)

ui <- fluidPage(
  mainPanel(
    verbatimTextOutput('list'),
    dataTableOutput('table')
  )
)

但是,如果我选择第 2-10 行,然后选择第一行,则仪表将重置为仅存在于第一行中的值。我查看了DT documentation 并找不到任何明显的方法来改变它,所以我试图只选择selectedRow()cumsum 值的尾部,但这没有奏效。

有没有什么方法可以得到被动选择的 Petal.width 的累积总和,而不管选择 DT 行的顺序如何?

【问题讨论】:

    标签: r shiny dt flexdashboard


    【解决方案1】:

    使用sum() 而不是cumsum() 似乎对我有用。

    library(shiny)
    library(DT)
    library(tidyverse)
    library(flexdashboard)
    shinyApp(
     ui = fluidPage(
    textOutput('list'),
    DTOutput('table'),
    flexdashboard::gaugeOutput("plt1")
    ),
    server = function(input, output, session) {
    
    iris2<-iris %>% mutate(perc=round((Petal.Width/sum(Petal.Width))*100,1))
    
    selectedRow <- eventReactive(input$table_rows_selected,{
      selrow<-sum(iris2$perc[c(input$table_rows_selected)])
    
    })
    
    output$plt1 <- flexdashboard::renderGauge({
      gauge(selectedRow(), min = 0, max = 100, symbol = '%', gaugeSectors(
        success = c(80, 100), warning = c(40, 79), danger = c(0, 39)))
    })
    
    output$list<-renderText({
      selectedRow()
    })
    
    output$table <- renderDT({iris2})
    
    })
    

    【讨论】:

    • 感谢 Aurelian;使用sum 确实更好,但我们的代码之间的真正区别在于我的示例过早关闭了iris2$perc 周围的cumsum 函数。比较selrow&lt;-cumsum(iris2$perc)[c(input$table_rows_selected)](我的)和selrow&lt;-sum(iris2$perc[c(input$table_rows_selected)])(你的)。愚蠢的错误,但感谢您指出!
    猜你喜欢
    • 2019-06-06
    • 2020-07-18
    • 2019-08-10
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2021-07-27
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多