【问题标题】:Loading data R shiny加载数据 R 闪亮
【发布时间】:2016-05-17 15:42:35
【问题描述】:

如果之前有人问过这个问题,我深表歉意。 我正在尝试运行一个基本的 R 闪亮应用程序,我将关键字作为文本输入,在该关键字上搜索数据框,然后打印结果(数据框中的某些项目)

我不知道我哪里出错了。当我运行下面的代码时,什么都没有发生!没有提交/操作按钮,因为我在 textInput 中使用默认值。

# ui.R

shinyUI(fluidPage(
  h1("Gene Finder",align="left"),
  fluidRow(
    column(3, 
           wellPanel(textInput("text", label = h4("Enter Identifier"), value = "BRCA1"))
           ),
    column(6,verbatimTextOutput("genename"))
    )
    )
)

服务器.R

# Server.R
setwd("/shiny-apps/sample-apps/test-1")
load("/shiny-apps/sample-apps/test-1/GenesHg19.RData")

findIdentifier <- function(genename) {
  if(length(grep("ENSG",genename))==0) {
    genename <- as.character(GenesHg19$external_gene_id[which(GenesHg19$external_gene_id==genename)])
  } else {
    genename <- as.character(GenesHg19$ensembl_gene_id[which(GenesHg19$ensembl_gene_id==genename)])
  }
  return(genename)
}

shinyServer(function(input,output) {
  tada <- reactive({ findIdentifier(genename=as.character(input$text)) })
    output$genename <- renderPrint({
        paste("Other known identifiers of",input$text,"are",tada)
    })
})

GenesHg19.RData 看起来像这样

【问题讨论】:

  • 首先你有一个错字在最后一行gename应该是genename
  • @warmoverflow 抱歉,已修复。还是没有解决问题
  • 将genename &lt;- findIdentifier(genename=input$text) 移动到output$genename。也许最好提供一个最小的例子,因为我们不能用上面的代码测试任何东西。
  • 这并不是一个完整的例子。例如这是什么:source('~/.active-rstudio-document') 你在加载一些额外的代码吗?如果没有至少几行 GenesHg18 数据框,就很难判断您在做什么。
  • 如果我注释掉我没有的所有内容,它会很好。

标签: r shiny


【解决方案1】:

这是一个工作示例,您能解释一下 findIdentifier 函数的用途吗?

GenesHg19$ensembl_gene_id[which(GenesHg19$ensembl_gene_id==genename)]

将始终返回一个长度为 0 的向量或 N x 基因名称的向量,因此 renderPrint 将返回“其他已知的基因名称标识符是”或 N 次“其他已知的基因名称标识符是基因名称”

library(shiny)
# setwd("/shiny-apps/sample-apps/test-1") # redundant, shiny server automatically sets the app folder to be working directory
load("GenesHg19.RData")
shinyApp(
  ui = shinyUI(fluidPage(
    h1("Gene Finder",align="left"),
    fluidRow(
      column(3, 
             wellPanel(textInput("text", label = h4("Enter Identifier"), value = "BRCA1"))
      ),
      column(6,verbatimTextOutput("genename"))
    )
  )
  ),
  server = shinyServer(function(input,output,session) {
    findIdentifier <- function(genename) {
      if(grepl(x=genename, pattern = 'ENSG')) {
        genename <- as.character(GenesHg19$ensembl_gene_id[which(GenesHg19$ensembl_gene_id==genename)])
      } else {
        genename <- as.character(GenesHg19$external_gene_id[which(GenesHg19$external_gene_id==genename)])
      }
      return(genename)
    }
    tada <- reactive({ findIdentifier(genename=as.character(input$text)) })
    output$genename <- renderPrint({
      paste("Other known identifiers of",input$text,"are",tada()) # reactive variable is function therefore has to be followed by ()
    })
  })
)

【讨论】:

    【解决方案2】:

    这里的问题是 shinyServer() 本身不是一个反应函数,因此不会注意到用户的输入。为了让genename 使用用户的输入进行更新,有必要将genename 变量的赋值包装在对renderPrint() 的调用中,因为renderPrint() 是 一个反应函数并且会注意到用户的输入。

    在您启动 Shiny 应用程序后,值得回顾一下 R 控制台;控制台显示出现的任何错误,而 Shiny 窗口可能会静默失败。例如,您会注意到 warmoverflow 提到的拼写错误,因为 R 会说它查找变量“gename”但没有找到。

    希望这会有所帮助!

    【讨论】:

    • 谢谢。也许,我对“反应式”编码的使用不是很清楚。我已经编辑了代码以使用响应式调用 findIdentifier()。问题依然存在!真正困扰我的是控制台上没有任何错误。它保持干净的状态,应用程序继续运行,但我在浏览器中根本看不到任何东西!
    • 您是否尝试过将output$genename 的赋值封装在一个函数中,然后由reactive() 调用?所以 reactive() 会调用一个函数,我们称它为 displayGeneName,它将接受 findIdentifier 的输出并包装 output$genename &lt;- renderPrint({ etc }) 的整个分配。我认为你的genename 被reactive() 正确分配,所以没有错误,但是genename 只存在于reactive() 的调用范围内。从 within reactive() 调用包装 renderPrint() 的函数将使所有必要的变量可用。
    • 谢谢,但我无法理解它。你能告诉我怎么做吗?
    • 试试output$genename &lt;- renderPrint({ paste("Other known identifiers of ",input$text," are ",tada()) });这利用了 tada() 作为一个函数,这是由 reactive() 返回的。
    猜你喜欢
    • 2015-03-17
    • 2016-07-28
    • 1970-01-01
    • 2021-06-21
    • 2016-08-18
    • 1970-01-01
    • 2016-03-08
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多