R блестящий: Добавить веб-ссылку на actionButton
У меня в блестящем приложении есть коробка, в которой есть кнопка, включенная в блестящую панель инструментов:
shiny::fluidRow(
shinydashboard::box(title = "Intro Page", "Some description...",
shiny::actionButton(inputId='ab1', label="Learn More", icon = icon("th"))
)
)
Я хочу включить веб-ссылку в кнопку, чтобы при нажатии на нее открывалась соответствующая веб-страница в новой вкладке.
Я знаю, что могу сделать это вместо этого:
# this does not create a submit button though, it just creates a link.
tags$div(class = "submit",
tags$a(href = "www.google.com",
"Learn More",
target="_blank")
)
Но с actionButton есть хорошая кнопка, и я могу добавить к ней иконку, которая выглядит эстетически лучше.
Как мне добавить ссылку на actionButton в блестящем?
4 ответа
Вы можете добавить параметр
onclick ="location.href='http://google.com';"
К действующей кнопке и ее нажатию вы попадете на google.com в текущем окне или можете добавить
onclick ="window.open('http://google.com', '_blank')"
и вы попадете в Google в новой вкладке
То есть
shiny::fluidRow(
shinydashboard::box(title = "Intro Page", "Some description...",
shiny::actionButton(inputId='ab1', label="Learn More",
icon = icon("th"),
onclick ="window.open('http://google.com', '_blank')")
)
)
onclick
Метод прост, но это зависит от JavaScript. Что еще более важно, будет неудобно, если вы захотите создать ссылку динамически. Я хочу, чтобы в моем приложении была ссылка, которая открывала определенную страницу в соответствии с пользовательским вводом, и я обнаружил, что вы можете просто одеть ссылку как кнопку.
Сначала я имею дело с динамической частью с uiOutput
а также renderUI
потому что ссылка может быть сгенерирована только в серверной части. Простая ссылка будет
a(h4("Open Link"), target = "_blank", href = paste0("http://www.somesite/", some_link))
Просто запустите эту строку в R мы получим
<a target="_blank" href="http://www.somesite/somelink">
<h4>Open Link</h4>
</a>
Чтобы создать кнопку, мы можем посмотреть, как выглядит кнопка действия.
> actionButton("download", "Download Selected",
icon = icon("cloud-download"))
<button id="download" type="button" class="btn btn-default action-button">
<i class="fa fa-cloud-download"></i>
Download Selected
</button>
Тогда мы можем сделать это
shiny::a(h4("Open Link", class = "btn btn-default action-button" ,
style = "fontweight:600"), target = "_blank",
href = paste0("http://www.somesite/", some_link))
получить
<a target="_blank" href="http://www.somesite/some_link">
<h4 class="btn btn-default action-button" style="fontweight:600">Open Link</h4>
</a>
Теперь у нас есть ссылка, похожая на кнопку, и вы можете дополнительно настроить ее стиль с помощью параметра style или настроенного CSS. Откройте свое приложение с помощью инструментов разработчика Chrome / Firefox, измените CSS так, как вам нужно, затем добавьте измененный CSS в style.css
в папке www, чтобы переопределить стиль по умолчанию.
Если вы посмотрите на вывод многих функций html-тегов, вы обнаружите, что вы действительно можете комбинировать и собирать множество вещей вместе, чтобы получить множество настроек.
Я хотел объединить несколько вопросов/ответов с моим собственным воспроизводимым примером. Это сочетает в себе ответ Марсенау, дракодока и Винсента. И отвечает на комментарий Капитана Шляпы.
Решение для динамической ссылки
Сторона пользовательского интерфейса
uiOutput("ui_open_tab_button")
На стороне сервера (где input$slider является примером динамического элемента)
output$ui_open_tab_button <- renderUI({
shiny::a(
h4(icon("th"),
paste0("Wiki Link Number: ",input$slider),
class = "btn btn-default action-button",
style = "fontweight:600"),
target = "_blank",
href = paste0("https://en.wikipedia.org/wiki/",input$slider)
)
})
Полный пример
library("shiny")
library("shinydashboard")
ui <- dashboardPage(
dashboardHeader(title = "Basic dashboard"),
dashboardSidebar(
sliderInput("slider", "Wiki Link Control", 1, 10, 1)
),
dashboardBody(
box(title = "UI Only Link", p("From Marsenau... Uses onclick"),
actionButton(
inputId='ab2',
label="Wiki Main Link",
icon = icon("th"),
onclick=paste0("window.open('https://en.wikipedia.org/wiki/','_blank')")
)
),
box(title = "Dynamic link", p("From dracodoc and Vincent... answers Captain Hat's question"),
uiOutput("ui_open_tab_button")
),
fluidRow(
htmlOutput("wiki")
)
)
)
server <- function(input, output) {
output$ui_open_tab_button <- renderUI({
shiny::a(
h4(icon("th"),
paste0("Wiki Link Number: ",input$slider),
class = "btn btn-default action-button",
style = "fontweight:600"),
target = "_blank",
href = paste0("https://en.wikipedia.org/wiki/",input$slider)
)
})
output$wiki <- renderUI({
tags$iframe(src=paste0("https://en.wikipedia.org/wiki/",input$slider), height=1000, width="100%")
})
}
shinyApp(ui, server, options = list(launch.browser=T))
Опираясь на точку зрения @dracodoc о динамически генерируемых ссылках, вы можете использовать renderUI
для достижения желаемого эффекта. В приведенном ниже примереinput$open_tab
относится к универсальному actionButton. Обратите внимание, что вам все равно нужно включить ссылку на renderUI ниже в свой пользовательский интерфейс (например, uiOutput("ui_open_tab"))
output$ui_open_tab <- renderUI({
req(input$open_tab > 0)
link <- function_to_build_the_link(a, b, c)
tags$script(paste0("window.open('", link, "', '_blank')"))
})