根据闪亮小部件的 if 条件将值替换为数据表

Posted

技术标签:

【中文标题】根据闪亮小部件的 if 条件将值替换为数据表【英文标题】:Replace value into a datatable based on if condition of a shiny widget 【发布时间】:2018-12-25 11:49:22 【问题描述】:

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

#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) 命名,而不是空的。 例如,最初加载应用时,第一行中的标签应为“Test 1”而不是 null。

【问题讨论】:

【参考方案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") 

  )


【讨论】:

以上是关于根据闪亮小部件的 if 条件将值替换为数据表的主要内容,如果未能解决你的问题,请参考以下文章

在 DT 表中的一行中嵌入闪亮的小部件

默认情况下,闪亮的应用程序数据对于特殊输入小部件不可见

R语言dplyr包na_if函数根据条件将数据对象替换为NA值实战

选择一个 DT 行,然后在闪亮的应用程序中根据小部件选择输入和 actionButton() 更改该行的一个单元格的值

如何根据颤动的条件渲染小部件?

如何以闪亮的方式遍历多个上传小部件?