R Shiny中带有textInput的交互式列/表更新

时间:2018-03-20 13:39:11

标签: r shiny shinydashboard

更新

我认为我认为是根本问题。以下R Shiny App生成一个带有2个文本输入框的UI,以及当文本在各自的文本输入框中更改时将消息打印到控制台的事件观察器。问题是这些事件观察者中只有一个正常工作,我无法弄清楚原因。

ui.R(缩写)

library(shiny)
library(shinydashboard)
library(DT)
library(data.table)

shinyUI(
  renderUI({
    fluidPage(
      column(12, dataTableOutput("Main_table")),
      box(textInput("TEST_BOX", label=NULL, value="TEST"))
      )
  })
  )

server.R(缩写)

shinyServer(function(input, output) {

  test <- reactiveValues()
  test$data <- data.table(ID = 1, Group = 1)

  output$Main_table <- renderDataTable({
    datatable(data.frame(test$data, 
          New_Group=as.character(textInput("BOX_ID", label = NULL, value = "TEST2", 
width = '100px'))), escape=F
              )})

  observeEvent(input$TEST_BOX, {
    print("Test Box Success")
    })

  observeEvent(input$BOX_ID, {
    print("Box ID Success")
  })

  })

原帖:

我正在尝试在R Shiny中创建一个简单的应用程序,以允许用户以交互方式更新小表的列中的值,然后能够点击“保存更改”按钮并更新表格以包含他们的选择。

我已经非常接近下面的代码(我认为),但由于某种原因,输入cbox_1到cbox_10总是返回为NULL。

ui.R

library(shiny)
library(shinydashboard)
library(DT)
library(data.table)

shinyUI(fluidPage(

  dashboardBody(uiOutput("MainBody")
  )
))

server.R

# Load libraries

library(shiny)
library(shinydashboard)
library(DT)
library(data.table)

# Define server logic
shinyServer(function(input, output) {

# Create sample data

  vals <- reactiveValues()
  vals$Data <- data.table(ID = 1:10, Group = 1:1)

# Create main UI with Save Changes button and additional text input box for testing.

  output$MainBody <- renderUI({
    fluidPage(
      box(width=12,
          h3(strong("Group Testing"),align="center"),
          hr(),
          box(textInput("test", label=NULL, value="TESTING")),
          column(6, offset = 5, actionButton("save_changes","Save changes")),
          column(12, dataTableOutput("Main_table"))
          )
      )
  })

# Function to be used to create multiple text input boxes.

  shinyInput = function(FUN, len, id, ...) {
    inputs = character(len)
    for (i in seq_len(len)) {
      inputs[i] = as.character(FUN(paste0(id, i), label = NULL, value = vals$Data$Group[i], width = '100px', ...))
    }
    inputs
  }

# Renders table to include column with text input boxes. Uses function above.

  output$Main_table <- renderDataTable({
    datatable(data.frame(vals$Data, New_Group=shinyInput(textInput, nrow(vals$Data),"cbox_")), options = list(dom = 't', pageLength = nrow(vals$Data), paging=FALSE, searching=FALSE), rownames=FALSE,
              escape=F)
  }
  )

# Tests if the test input box works.

  observeEvent(input$test, {

    print("Success1")

  })

# Tests if the first input box in the table works.

  observeEvent(input$cbox_1, {

    print("Success2")

  })

# Tests if the Save Changes button works.

  observeEvent(input$save_changes, {

    print("Success3")

    # Assigns the values in the input boxes (New_Group) to the existing Group column.

    for (i in 1:nrow(vals$Data)) {
      vals$Data$Group[i] <- eval(paste0("input$cbox_", i))
    }
    datatable(data.frame(vals$Data, New_Group=shinyInput(textInput, nrow(vals$Data),"cbox_")), options = list(pageLength = nrow(vals$Data), paging=FALSE, searching=FALSE), rownames=FALSE,
              escape=F)

  })

})

代码末尾的前两个observeEvents仅用于测试目的。即使第一个框的内容发生变化,也不会打印“Success2”。更改测试盒时会打印“Success1”,但我不确定为什么一个工作而另一个不工作。我已经尝试在代码的各个位置插入一个browser()语句来检查cbox_1的值,但它总是返回NULL。如果我接近它完全错误的话,我也会对这个问题的替代解决方案持开放态度。感谢。

1 个答案:

答案 0 :(得分:0)

经过进一步研究,使用rhandsontable包的方法似乎是最好的解决方案。我在这个例子之后模拟了我的代码:

Data input via shinyTable in R shiny application

我还使用了这里描述的几个选项:

https://jrowen.github.io/rhandsontable/#introduction