如何在闪亮的应用程序的每次渲染时停止重新创建数据集

时间:2018-08-21 17:54:37

标签: r shiny

我有一个简单的闪亮应用程序,其中使用selectInput()“ Label”从数据表中选择一个Label,然后使用textInput()“ Change to”更改其名称。问题是我希望应用程序保留我所做的所有名称更改,并且当我选择另一个Label时不返回默认名称。我认为问题在于DF仅存在于rt4函数之内,而不存在于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

      )

    }

1 个答案:

答案 0 :(得分:1)

重要更改:
-如您所料,DF被定义一次,在服务器中,请参见shiny scoping rules
-使用<<-修改全局(服务器)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)