【问题标题】:How to validate user input in shiny如何在闪亮中验证用户输入
【发布时间】:2017-08-22 11:19:09
【问题描述】:

我正在开发一个非常简单的 Shiny 应用程序,它接收 DNA 密码子并返回相应的氨基酸。我的问题是我想验证用户输入,以便它只能接受 3 个字母(单个密码子),必须是大写字母,并且只接受 DNA 碱基(A、C、T 或 G)。我看过Shiny's validation article,但不断遇到错误。 这是我到目前为止的代码:

ui.R

library(shiny)
library(shinythemes)

shinyUI(fluidPage(

  theme = shinytheme("slate"),

  # Application title
  titlePanel("Codon lookup"),

  # 
  sidebarLayout(
    sidebarPanel(
      textInput(
        inputId = "codon",
        label = "Enter a codon",
        value = ""),
      actionButton(inputId = "go", label = "Search")
    ),

    # 
    mainPanel(
      verbatimTextOutput("aminoacid")
    )
  )
))

服务器.R

library(shiny)
library(Biostrings)

shinyServer(function(input, output) {

  data <- eventReactive(input$go, {

    #validate somehow
      input$codon


  })


  output$aminoacid <- renderText({

    GENETIC_CODE[[as.character(data())]]

  })

})

另外,如果有人知道检索氨基酸全名的简单方法,而不仅仅是单个字母符号,那将很有帮助。欢迎任何其他建议。

【问题讨论】:

  • 对我有什么反馈吗?
  • @MikeWise 是的,抱歉,今天很忙。这太棒了!我曾考虑过使用 selectInput,但将来可能想进一步扩展它,用户可以输入整个序列并进行翻译。很棒且有用的解释,谢谢!

标签: r shiny user-input


【解决方案1】:

在这种情况下,响应式并不是真正进行验证的正确位置,因为您没有在那里使用 GENETIC_CODE。所以我把它移到了renderText 输出节点。如果您有 reactive 进行查找,您可以在那里进行查找。

我查看了 GENETIC_CODE,无论如何,将其作为下拉列表并将其用作验证似乎更有意义。所以我继续使用 renderUI 在其中放置了一个 selectInput,因为如果您通常在服务器中创建输入控件,您将拥有更大的灵活性。

我还将Search 按钮移到密码子选择控件上方,因为它被选择覆盖了。

library(shiny)
library(shinythemes)

u <- shinyUI(fluidPage(

  theme = shinytheme("slate"),

  # Application title
  titlePanel("Codon lookup"),

  # 
  sidebarLayout(
    sidebarPanel(
      actionButton(inputId = "go", label = "Search"),
      uiOutput("codonselection")
    ),

    # 
    mainPanel(
      verbatimTextOutput("aminoacid")
    )
  )
))

library(Biostrings)

s <- shinyServer(function(input, output) {

  data <- eventReactive(input$go, {
    input$codon
  })
  output$codonselection <- renderUI({
    choices <- names(GENETIC_CODE)
    default <- "TTC"
    selectInput("codon",label="Select Codon",choices=choices,selected=default)
  })

  output$aminoacid <- renderText({
    lookupcodon <-as.character(data())
    if (lookupcodon %in% names(GENETIC_CODE)){
      return(GENETIC_CODE[[ lookupcodon  ]])
    } else {
      return("Name not in GENETIC_CODE")
    }
  })

})
shinyApp(u,s)

它工作的屏幕截图:

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多