2015-10-06 185 views
3

我有兩個閃亮的應用程序,我想鏈接到另一個。其中一個數據表具有一些我想鏈接到另一個應用程序的值,我可以從selectInput選項中選擇該值。R閃亮的應用程序之間建立鏈接

概括起來我有一個應用程序,看起來像這樣(從here拍攝):

library(shiny) 
library(DT) 

server <- function(input, output) { 
    output$iris_type <- DT::renderDataTable({ 
    datatable(data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>")), 
       escape = FALSE, 
       callback = JS(
       'table.on("click.dt", "tr", function() { 
       tabs = $(".tabbable .nav.nav-tabs li a"); 
       $(tabs[1]).click();})')) 
    }) 

    output$filtered_data <- DT::renderDataTable({ 
    selected <- input$iris_type_rows_selected 
    if(is.null(selected)){ 
     datatable(iris) 
    } else { 
     datatable(iris[iris$Species %in% unique(iris$Species)[selected], ]) 
    } 
    }) 
} 

ui <- shinyUI(fluidPage(
    mainPanel(
    tabsetPanel(
     tabPanel("Iris Type", DT::dataTableOutput("iris_type")), 
     tabPanel("Filtered Data", DT::dataTableOutput("filtered_data")) 
    ) 
) 
)) 

shinyApp(ui = ui, server = server) 

而另一個問題:

library(shiny) 
library(dplyr) 
library(tidyr) 

data(iris) 

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

    iris1 <- reactive({ 
    iris %>% 
     filter(Species %in% input$select) 
    }) 

    output$filtered_data <- DT::renderDataTable({ 
    datatable(iris1()) 
    }) 
}) 

ui <- shinyUI(fluidPage(
    mainPanel(
    selectInput("select", label=h3("Iris Type"), choices=list('setosa', 'versicolor', 'virginica'), 
       selected='setosa', multiple=FALSE), 
    DT::dataTableOutput("filtered_data") 

) 
)) 

shinyApp(ui = ui, server = server) 

(我知道這是一個愚蠢的例子,但它顯示了我想要什麼)

當我點擊第一個應用程序中的物種之一,我想它鏈接到第二個應用程序而不是o f選擇另一個選項卡,然後從第一個應用程序中選擇已點擊的物種(請參閱下圖)。

我想我必須將鏈接從"<a href='#filtered_data'>", unique(iris$Species), "</a>"更改爲另一個應用的鏈接,但我不知道如何在第二個應用中更改我的selectInput選項的值。請幫忙。

Image explanation

+1

http://stackoverflow.com/questions/25297489/accept-http-request-in-r-shiny-application這似乎非常接近你在做什麼。 – Shape

+0

也許它很接近,但我不知道如何使用鏈接中的答案來解決我的問題。 – potockan

回答

2

修訂我先前的響應,(因爲,同意了,一個簡單的解決方案應提供)

相反,這裏是建於挖掘會話對象的解決方案:

如果打開經由

<a href="http://server.com/app2?Species=setosa">

(變化server.com/app2至y第二光澤應用我們的實際鏈接) 然後在第二個應用程序,包括本作的選擇對象:

編輯:請注意,因爲這依賴於會話對象,你的服務器功能將改變function(input,output)function(input,output,session)

ui.R :

htmlOutput('selectSpecies') 

server.R:

output$selectSpecies <- renderUI({ 
    URLvars <- session$clientData$url_search 
    # NOTE: the following regex is not one-size-fits-all 
    # if you use multiple inputs, you'll probably need to adjust it 
    # also remove special characters, because I want to sterilize our inputs 

    Species <- gsub('[[:punct:]]','',URLvars) 
    Species <- sub('^.*Species(.*$)','\\1',URLvars) 

    selectInput("select", label=h3("Iris Type"), choices=list('setosa', 'versicolor', 'virginica'), 
      selected=ifelse(Species=="",'setosa',Species), multiple=FALSE) 
}) 

所以會話對象確實包含的所述部分它打開的網址,所以這只是一個將該信息轉換爲我們可以使用的變量的問題。

+0

謝謝,它的工作原理!其實我不需要這行:'Species < - gsub('[[:punct:]]','',URLvars)'但其餘的很好:) – potockan

+0

我加了那條線,因爲我沒有知道這是否會成爲公衆可查看的頁面。我想減輕某人注入代碼的可能性。正如xkcd所說,總是很好的消毒你的投入。 :) – Shape