R带有数字输入和反应列的闪亮数据表

时间:2018-05-27 03:29:19

标签: r datatable shiny dplyr dt

我正在构建一个闪亮的数据表,其中一列用于numericinput,另一列用于输入。它与你在excel中可以做的类似,方程式嵌入在单元格中。我正在给虹膜作为例子并尝试计算花瓣面积。因此,豌豆面积等于Petal.Length * Petal.Width / Adjust。用户输入adjust参数调整区域。这里也提出了类似的问题,但没有直接答案。 Insert a numeric input for each row - R Shiny

library(shiny)
library(DT)
library(dplyr)

ui <- basicPage(

  DT::dataTableOutput('x1')
)

server <- function(input, output, session) { 
  # create a character vector of shiny inputs 
  shinyInput = function(FUN, len, id, ...) { 
    inputs = character(len) 
    for (i in seq_len(len)) { 
      inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))
    } 
    inputs 
  } 

  # obtain the values of inputs 
  shinyValue = function(id, len) { 
    unlist(lapply(seq_len(len), function(i) { 
      value = input[[paste0(id, i)]] 
      if (is.null(value)) 1 else value 
    })) 
  } 

  # a sample data frame 
  DF <- reactive(
    iris <- iris %>%
      mutate(
        adjust = shinyInput(numericInput, nrow(iris), 'adj', value = 1),
        Petal_Area = Petal.Length*Petal.Width/shinyValue('adj', nrow(iris)) 
      )
  )

  # render the table containing shiny inputs 
  output$x1 = DT::renderDataTable(

    # use slider to control number of rows shown in table
    DF(), server = FALSE, escape = FALSE, options = list( 
      preDrawCallback = JS('function() { 
                           Shiny.unbindAll(this.api().table().node()); }'), 
      drawCallback = JS('function() { 
                        Shiny.bindAll(this.api().table().node()); } ') 
      ) 
      ) 
} 

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

这是一个不完整的答案。希望其他用户可以改进它。如果没有,那么这是最好的答案。

我现在尝试了大约半个小时但由于某种原因(可能因为DT并不意味着像Excel那样使用),我无法在DT中得到计算结果-表。但是,如果我不在DT - 表格中显示结果,反应和计算会有效。

我只做了两处改动:

  1. 我添加了一个调试表
  2. 我替换了您的dplyr - 代码并删除了计算
  3. 代码如下所示:

    library(shiny)
    library(DT)
    
    ui <- basicPage(
      DT::dataTableOutput('x1'),
      tableOutput('debug')
    )
    
    server <- function(input, output, session) { 
      # create a character vector of shiny inputs 
      shinyInput = function(FUN, len, id, ...) { 
        inputs = character(len) 
        for (i in seq_len(len)) { 
          inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))
        } 
        inputs 
      } 
    
      # obtain the values of inputs 
      shinyValue = function(id, len) { 
        unlist(lapply(seq_len(len), function(i) { 
          value = input[[paste0(id, i)]] 
          if (is.null(value)) 1 else value 
        })) 
      } 
    
      # a sample data frame 
      DF <- reactive({
        iris_adj <- iris
        iris_adj$adjust<-shinyInput(numericInput, nrow(iris), 'adj', value = 1)
        # iris_adj$Petal_area<-iris$Petal.Length*iris$Petal.Width/shinyValue('adj',nrow(iris))
        return(iris_adj)
      })
    
    
      # render the table containing shiny inputs 
      output$x1 <- DT::renderDataTable(
    
        # use slider to control number of rows shown in table
        DF(), server = FALSE, escape = FALSE, options = list( 
          preDrawCallback = JS('function() { 
                               Shiny.unbindAll(this.api().table().node()); }'), 
          drawCallback = JS('function() { 
                            Shiny.bindAll(this.api().table().node()); } ') 
          ) 
          )
      output$debug<-renderTable({
        cbind(DF()[,-6],shinyValue('adj',nrow(iris)),Petal_Area=iris$Petal.Length*iris$Petal.Width/shinyValue('adj',nrow(iris)))
      })
          } 
    
    shinyApp(ui, server)
    

    一旦我添加计算,DT的输出就无法进入调试表。

    就个人而言:我记得大约半年前使用这个shinyInputshinyValue伎俩。我还记得它非常不稳定。 我不建议任何想要开发稳定应用的人

    我还记得有另一个R-package用于完整的交互式表格。它被称为rhandsontables。也许试试:https://jrowen.github.io/rhandsontable/