在闪亮的应用程序中,我们可以添加javascript代码,以便在使用library(htmlwidgets)
中的onRender
渲染小部件时运行。这似乎不适用于默认的render*
函数。有没有一种方法可以为这些渲染函数实现类似的功能?
无论何时渲染绘图和传单小部件,下面的应用程序都会显示警报,但不适用于renderUI
和renderPlot
。
library(shiny)
library(plotly)
library(leaflet)
library(htmlwidgets)
ui <- fluidPage(
actionButton('a1','a1'),
fluidRow(
column(
width=6,
plotlyOutput('plt'),
plotOutput('p2')
),
column(
width=6,
uiOutput('foo'),
leafletOutput('map')
)
)
)
server <- function(input, output, session) {
output$foo <- renderUI({
input$a1
tagList(runif(1)) %>%
onRender('function() {alert("renderUI works");}')
})
output$plt <- renderPlotly({
input$a1
plot_ly(type='scatter', mode='markers', x=runif(10)) %>%
onRender('function() {alert("plotly works");}')
})
output$p2 <- renderPlot({
input$a1
hist(runif(50)) %>%
onRender('function() {alert("renderPlot works");}')
})
output$map <- renderLeaflet({
input$a1
leaflet() %>%
addTiles() %>%
onRender('function() {alert("leaflet works");}')
})
}
shinyApp(ui, server)
onRender
指的是渲染一个htmlwidget,而不是渲染shing的render*函数。
你可以在没有光泽的情况下使用它。
onRender
需要一个HTML小部件对象,因此不适用于例如标签-请参阅?onRender
:
使用此函数来补充小部件的内置JavaScript使用额外的自定义JavaScript代码呈现逻辑特定的小部件对象。
您可以使用library(shinyjs)
来实现类似的行为:
library(shiny)
library(plotly)
library(leaflet)
library(htmlwidgets)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
actionButton('a1','a1'),
fluidRow(
column(
width=6,
plotlyOutput('plt'),
plotOutput('p2')
),
column(
width=6,
uiOutput('foo'),
leafletOutput('map')
)
)
)
server <- function(input, output, session) {
output$foo <- renderUI({
input$a1
runjs('alert("renderUI works");')
tagList(p("p-tag"))
})
output$plt <- renderPlotly({
input$a1
plot_ly(type='scatter', mode='markers', x=runif(10)) %>%
onRender('function() {alert("plotly works");}')
})
output$p2 <- renderPlot({
input$a1
runjs('alert("renderPlot works");')
hist(runif(50))
})
output$map <- renderLeaflet({
input$a1
leaflet() %>%
addTiles() %>%
onRender('function() {alert("leaflet works");}')
})
}
shinyApp(ui, server)