根据光泽小部件的条件将值替换到数据表中

时间:2018-07-17 17:21:57

标签: r shiny dt

我有一个简单的闪亮应用程序:

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

             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3"),
               uiOutput("book6")
             ),
             mainPanel(
               DT::dataTableOutput("hot3")

             )
           )))
#server.r
library(shiny)
library(DT)
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({
    if(is.null(input$bk6)){
        DF=data.frame(
          Label=paste("Test",1:input$text2),
          stringsAsFactors = FALSE)
    }
    else{
        DF=data.frame(
          Label=paste("Test",1:input$text2),
          stringsAsFactors = FALSE)
        DF[DF==input$bk3]<-input$bk6
        DF
      }
  })
  output$hot3 <-DT::renderDataTable(
    rt4(),
    selection=list(mode="single") 

  )

}

您可以看到,每次numericInput()“测试”我都会添加一行。然后,我使用selectInput()“标签”选择其中一种测试。选择测试后,我用第三个textInput()“更改为”将其重命名。 问题是我希望我的textInput()默认为空。因此,如果此字段为空,则数据表中的“标签”应使用Label=paste("Test",1:input$text2)来命名为normaly,而不应原样为空。 例如,最初加载应用程序时,第一行中的标签应为“测试1”,而不是null。

1 个答案:

答案 0 :(得分:1)

发生问题是因为您的初始化为NULL,但是调用input$bk6时,它不是NULL而是空字符""。您可以通过对响应数据框执行以下类似操作来解决此问题。注意对is.null(input$bk6)|input$bk6==""

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

但是,您可能要进行初始化以解决此问题。诸如此类的内容可能会消除您在启动过程中收到的一些警告。

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

             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3"),
               uiOutput("book6")
             ),
             mainPanel(
               DT::dataTableOutput("hot3")

             )
           )))
#server.r
library(shiny)
library(DT)
server <- function(input, output,session) {
  output$tex2<-renderUI({
    numericInput("text2","#tests",
                 value = 1,
                 min=1
    )
  })
  output$book3<-renderUI({
    if(!is.null(input$text2)){
    selectInput("bk3", 
                "Label", 
                choices=(paste("Test",1:input$text2)))
  }})
  output$book6<-renderUI({
    textInput("bk6", "Change to",
              value=""
    )
  })

  rt4<-reactive({
    if(!is.null(input$bk6)){
     if(input$bk6==""){
      DF=data.frame(
        Label=paste("Test",1:input$text2),
        stringsAsFactors = FALSE)
    }
    else{
      DF=data.frame(
        Label=paste("Test",1:input$text2),
        stringsAsFactors = FALSE)
      DF[DF==input$bk3]<-input$bk6
      DF
    }
  }
  })
  output$hot3 <-DT::renderDataTable(
    rt4(),
    selection=list(mode="single") 

  )

}