我有一个简单的闪亮应用程序,其中使用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
)
}
答案 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)