【问题标题】:How to use reactiveValues() in order to store changes in a shiny app如何使用 reactiveValues() 将更改存储在闪亮的应用程序中
【发布时间】:2018-08-23 08:52:27
【问题描述】:

我有一个简单的闪亮应用程序,我在其中使用numericInput() 设置数据帧的行数。然后我使用selectInput()“标签”从数据表中选择标签,然后更改其名称使用 textInput() “更改为”。问题是每次我尝试使用textInput() 更改新标签的名称时,我修改的前一个标签都会返回默认名称。我相信这种情况正在发生,因为我的 DF 是在反应函数内部创建的,并且不能接受子集。我可能需要使用reactiveValues() 来存储以前的值,但我不知道如何使用它,所以我在这里使用reactive() 来显示一个工作示例。

library(shiny)
library(DT)

ui <- navbarPage(
  "Application",
  tabPanel("General",
           sidebarLayout(
             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3"),
               uiOutput("book6")
             ),
             mainPanel(
               DT::dataTableOutput("hot3")
             )
           )))
#server.r
server <- function(input, output,session) {



  output$tex2<-renderUI({
    numericInput("text2", "#tests", value = 1, min=1)
  })

  output$book3<-renderUI({
    selectInput("bk3", "Label",  choices=(paste("Test",1:input$text2)))
  })

  output$book6<-renderUI({
    textInput("bk6", "Change to", value=NULL)
  })
  rt4<-reactive({
    DF <- data.frame(
      Test=paste(1:input$text2),
      Label=paste("Test",1:input$text2),
      stringsAsFactors = FALSE)
    if(!is.null(input$bk6) && input$bk6!=""){
      DF[DF$Label==isolate(input$bk3), "Label"] <- input$bk6
    }
    {
    DF
    }

  })

  output$hot3 <-DT::renderDataTable(
    rt4(),
    rownames= FALSE

  )
}

【问题讨论】:

  • 您可能会发现很难同时更新基于input$text2 和基于input$bk6Label,因为它们当前正在相互覆盖
  • 是的,但数据框也必须是动态的。如果这些可以使其正常工作,我愿意接受替代品。

标签: r shiny reactive


【解决方案1】:

这似乎有效

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

ui <- navbarPage(
  "Application",
  tabPanel("General",
           sidebarLayout(
             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3"),
               uiOutput("book6"),
               actionButton('submit','submit')

             ),
             mainPanel(
               DT::dataTableOutput("hot3")
             )
           )))

server <- function(input, output,session) {

  output$tex2<-renderUI({
    numericInput("text2", "#tests", value = 1, min=1)
  })

  output$book3<-renderUI({
    selectInput("bk3", "Label",  choices=(paste("Test",1:input$text2)) )
  })

  output$book6<-renderUI({
    textInput("bk6", "Change to", value=NULL)
  })

  values <- reactiveValues(rv = NULL)

observe( { req(input$text2)
  Test <-paste(1: input$text2)
  Label <- paste("Test",1:input$text2)
         values$rv<-data.frame( Test= Test, Label=Label, stringsAsFactors = FALSE)}
        )

  observeEvent(input$submit,{

    if(!is.null(input$bk6) && input$bk6!=""){
          values$rv  <- values$rv %>%
             mutate(Label= ifelse(Label== input$bk3,input$bk6,Label))
    }
  })

  output$hot3 <-DT::renderDataTable( {
     datatable(values$rv, rownames=FALSE)
    })

}

shinyApp(ui,server)

【讨论】:

  • 忘记添加了,这个解决方案使用了提交按钮,以及相关的 ObserveEvent 来更新数据集
【解决方案2】:

如果您将数据框存储在 reactiveValues 对象中,您可以根据输入更新数据,例如像这样:

library(shiny)
library(DT)

ui <- navbarPage(
  "Application",
  tabPanel("General",
           sidebarLayout(
             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3"),
               uiOutput("book6")
             ),
             mainPanel(
               DT::dataTableOutput("hot3")
             )
           )))
#server.r
server <- function(input, output,session) {



  output$tex2<-renderUI({
    numericInput("text2", "#tests", value = 1, min=1)
  })

 # update selectinput reactiveValues change
  output$book3<-renderUI({
    selectInput("bk3", "Label",  choices=rtdf4$DF[, 'Label'])
  })

  output$book6<-renderUI({
    textInput("bk6", "Change to", value=NULL)
  })

  rtdf4 <- reactiveValues()

 # fill reactiveValues based on the numberinput
  observe({
    if (is.null(input$text2)){
      rtdf4$DF <- data.frame(
        Test=paste(1),
        Label=paste("Test",1),
        stringsAsFactors = FALSE
      )
    } else {
      rtdf4$DF <- data.frame(
      Test=paste(1:input$text2),
      Label=paste("Test",1:input$text2),
      stringsAsFactors = FALSE
      )
    }

  })

  rt4 <- reactive({
    if (is.null(rtdf4$DF))
      return(NULL)

    if(!is.null(input$bk6) && input$bk6!=""){
      rtdf4$DF[rtdf4$DF$Label==isolate(input$bk3), "Label"] <- input$bk6
    }
    {
      rtdf4$DF
    }

  })

  output$hot3 <-DT::renderDataTable(
    rt4(),
    rownames= FALSE

  )
}

shinyApp(ui,server)

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2017-07-27
    • 2013-07-08
    • 2021-10-30
    • 2018-12-29
    相关资源
    最近更新 更多