2017-02-16 25 views
7

Chciałbym pokazać w mojej błyszczącej aplikacji link, który kieruje do adresu URL wygenerowanego na podstawie danych wprowadzonych przez użytkownika. Nie chcę wyświetlać pełnego tekstu adresu URL. Wiem, że funkcja a (href = ", label =" ") może być używana, jeśli wcześniej znam adres URL, ale w tym przypadku adres URL zależy od danych wprowadzonych przez użytkownika. Poniższa nie działa:Osadź reaktywnie wygenerowany adres URL w błyszczącym

ui <- fluidPage(
    titlePanel("Show map of a given state"), 
    sidebarLayout(
     sidebarPanel(
      textInput("state", label = "State", value = "CA", placeholder = "California or CA"), 
      actionButton("showU","Show map") 
     ), 
     mainPanel(
      conditionalPanel(
       condition = "input.showU > 0", 
       htmlOutput("url"), 
       a(href=htmlOutput("url"),"Show in Google Map",target="_blank") 
      ) 
     ) 
    ) 
) 

server <- function(input, output){ 
    observeEvent(input$showU,{ 
    output$url <-renderUI({paste("https://www.google.com/maps/place/", input$state, sep="")}) 
    }) 
} 

shinyApp(ui,server) 

Mam nadzieję, że mogę kliknąć na przycisk „Pokaż w Google Map” i być skierowane do adresu URL generowane na bieżąco. Proszę, pomóż mi, dziękuję.

Odpowiedz

5

Trzeba użyć renderUI wraz z uiOutput zaktualizować UI reaktywnie:

library(shiny) 
ui <- fluidPage(
    titlePanel("Show map of a given state"), 
    sidebarLayout(
    sidebarPanel(
     textInput("state", label = "State", value = "CA", placeholder = "California or CA"), 
     actionButton("showU","Show map") 
    ), 
    mainPanel(
     conditionalPanel(
     condition = "input.showU > 0", 
     uiOutput("url") 
    ) 
    ) 
) 
) 

server <- function(input, output){ 
    observeEvent(input$showU,{ 
    output$url <-renderUI(a(href=paste0('https://www.google.com/maps/place/', input$state),"Show in Google Map",target="_blank")) 
    }) 
} 

shinyApp(ui,server) 
+0

Dziękuję bardzo! Dokładnie tego potrzebowałem. –

+0

@YuZhang cieszę się, że moja odpowiedź pomogła, proszę zaakceptuj to następnie – HubertL

0

Jeśli to jest rzeczywiście pytania na temat tworzenia reaktywnych łącza URL, a następnie odpowiedź HubertL jest do zrobienia.

Jeśli chcesz zachować mapę i szukać funciton wszystkim samowystarczalny w błyszczące, zamiast otworzyć nowy link do Google Maps, można korzystać z pakietu googleway do osiągnięcia tego samego zadania

library(shiny) 
library(googleway) 


ui <- fluidPage(
    titlePanel("Show map of a given state"), 
    sidebarLayout(
    sidebarPanel(
    ), 
    mainPanel(
     google_mapOutput(outputId = "myMap", height = "600px") 

    ) 
) 
) 

server <- function(input, output){ 

    ## you need a valid API key from Google Maps 
    ## https://developers.google.com/maps/ 

    map_key <- "your_map_api_key" 

    output$myMap <- renderGoogle_map({ 
    google_map(key = map_key, search_box = T) 
    }) 

} 

shinyApp(ui,server) 

enter image description here

+0

To jest naprawdę fajne! Zainstalowałem z github 'devtools :: install_github (" SymbolixAU/googleway ")'. –

+0

@YuZhang - cieszę się, że Ci się podoba. Zauważ, że wciąż jest w fazie rozwoju, więc może się nieznacznie zmienić, ale powinien być stabilny do ogólnego użytku. – SymbolixAU

+0

@YuZhang - Uwaga widget mapy jest teraz na CRAN, nie ma już potrzeby rozwoju wersji – SymbolixAU

0

użyłem przycisku HTML, dla których mogą być generowane url rekurencyjnie

library(shiny) 

# Define UI for application that draws a histogram 
ui <- fluidPage(

    # Application title 
    titlePanel("HTML button"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
     sidebarPanel(
     sliderInput("bins", 
        "Number of bins:", 
        min = 1, 
        max = 50, 
        value = 30) 
    ), 

     # Show a plot of the generated distribution 
     mainPanel(
     plotOutput("distPlot"), 
     HTML(paste0(htmlOutput('url_test'))) 
    ) 
    ) 
) 

# Define server logic required to draw a histogram 
server <- function(input, output) { 

    output$distPlot <- renderPlot({ 
     # generate bins based on input$bins from ui.R 
     x <- faithful[, 2] 
     bins <- seq(min(x), max(x), length.out = input$bins + 1) 

     # draw the histogram with the specified number of bins 
     hist(x, breaks = bins, col = 'darkgray', border = 'white') 
    }) 

    output$url_test = renderText({ 
    paste('<a href=',cultivar_url(),' class="btn btn-default">Go to Google</a>') 
    }) 

    cultivar_url = reactive({ 
    print('https://www.google.com') 
    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server)