2016-05-17 225 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() 
    }) 
    }) 
)