2016-05-17 170 views
0

我很抱歉,如果这已被问及之前。 我想运行一个基础研发闪亮的应用,在那里我需要一个关键字作为文本输入,搜索数据帧上的关键字,并打印出结果(从数据帧的一些项目)加载数据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")) 
    ) 
    ) 
) 

Server.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看起来像这样

enter image description here

+0

首先你在最后一行有一个错字'gename'应该是'genename' –

+0

@warmoverflow对不起,修正了。仍然没有解决问题 – Jason

+0

将'genename < - findIdentifier(genename = input $ text)'移到'output $ genename'中。也许最好提供一个最简单的例子,因为我们不能用上面的代码来测试任何东西。 – Gopala

回答

0

这里的问题是,shinyServer()本身并不是一个反应函数,因此不没有注意到用户的输入。为了让genename以用户的输入更新,有必要在调用renderPrint()时将genename变量的分配包装起来,因为renderPrint()是一个反应函数,并且会注意到用户的输入。

在您启动Shiny应用程序之后,值得回顾R控制台;控制台会显示出现的任何错误,而Shiny窗口可能会以静默方式失败。例如,你会注意到由于热流溢出所提到的拼写错误,因为R会说它寻找变量'gename'并且没有找到它。

希望这有助于!

+0

谢谢。也许,我不太清楚使用“反应性”编码。我编辑了使用反应调用findIdentifier()的代码。问题仍然存在!真正困扰我的是控制台上没有任何错误。它作为一个国家保持清洁,应用程序保持运行,但我根本没有看到任何浏览器! – Jason

+1

您是否尝试过在函数中包装'output $ genename'的赋值,然后由reactive()调用?因此,reactive()会调用一个函数,我们称它为'displayGeneName',它将接受'findIdentifier'的输出,并包装'output $ genename < - renderPrint({etc})'的整个赋值。我认为你的'genename'正在通过reactive()正确分配,所以没有错误,但'genename'只存在于调用reactive()的范围内。调用_within_active()封装renderPrint()函数可以提供所有必要的变量。 –

+0

谢谢,但我无法绕过它。你能告诉我怎么做吗? – Jason

0

这里是工作的例子,虽然你能解释findIdentifier函数的目的吗?

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

将总是返回一个0长度矢量或N X genename的向量,因此renderPrint将返回“其它已知genename的标识符是”或N次“genename的其他已知的标识符是genename”

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() 
    }) 
    }) 
)