我有一个简单的闪亮应用程序,其中使用numericInput()
设置数据框的行数。然后使用selectInput()
“ Label”从数据表中选择标签,然后然后使用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
)
}
答案 0 :(得分: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)
答案 1 :(得分:1)
如果您将数据帧存储在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)