首页 > 解决方案 > 如何在每次渲染闪亮的应用程序时停止重新创建数据集

问题描述

我有一个简单的闪亮应用程序,我在其中使用 selectInput()“Label”从数据表中选择一个 Label,然后使用 textInput()“Change to”更改其名称。问题是我希望应用程序保留我所做的所有名称更改,而不是在我选择另一个标签时返回默认名称。我认为问题在于 DF 仅存在于 rt4 函数中,而不存在于它之外,因此在每次渲染时都会重新创建它。

 #ui.r
    navbarPage(
      "Application",
      tabPanel("General",
               sidebarLayout(

                 sidebarPanel(
                   uiOutput("book3"),
                   uiOutput("book6")
                  ),
                 mainPanel(

                   DT::dataTableOutput("hot3")

                 )
               )))
    #server.r
    library(shiny)
    library(DT)
    server <- function(input, output,session) {



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

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

      rt4<-reactive({
        if(is.null(input$bk6)|input$bk6==""){
            DF=data.frame(
              Test=paste(1:5),
              Label=paste("Test",1:5),
              stringsAsFactors = FALSE)
        }
        else{
          DF[DF==input$bk3]<-input$bk6
        }
        DF

      })

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

      )

    }

标签: rshiny

解决方案


重要更改:
- 如您所料,DF在服务器中定义一次,请参阅闪亮的范围规则
- 用于<<-修改全局(服务器)DF
-isolate()仅用于对更改做出反应input$bk6

library(shiny)
library(DT)

ui <- navbarPage(
    "Application",
    tabPanel("General",
             sidebarLayout(
                 sidebarPanel(
                     uiOutput("book3"),
                     uiOutput("book6")
                 ),
                 mainPanel(
                     DT::dataTableOutput("hot3")
                 )
             )))

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

    DF <- data.frame(
        Test=paste(1:5),
        Label=paste("Test",1:5),
        stringsAsFactors = FALSE)

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

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

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

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

    )
}

shinyApp(ui, server)

推荐阅读