簡體   English   中英

帶數字輸入和反應性列的R閃亮數據表

[英]R shiny datatable with numericinput and reactive column

我正在建立一個閃亮的數據表,其中一列用於數值輸入,另一列對輸入具有反應性。 這類似於您可以在單元格中嵌入方程式的情況下在excel中執行的操作。 我在下面以虹膜為例,並嘗試計算花瓣面積。 因此,果皮面積等於花瓣長度*花瓣寬度/調整。 用戶將輸入Adjust參數來調整區域。 這里提出了類似的問題,但沒有直接答案。 為每行插入一個數字輸入-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)

這是一個不完整的答案。 希望其他用戶可以對此進行改進。 如果沒有,那么這是最好的答案。

我現在嘗試了大約半小時,但是由於某種原因(也許是因為DT不能像Excel一樣使用),我無法在DT -table中獲得計算結果。 但是,如果不在DT表中顯示結果,反應性和計算就會起作用!

我只做了兩個更改:

  1. 我添加了調試表
  2. 我替換了您的dplyr並刪除了計算

代碼如下:

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM