library(shiny)
ui <- fluidPage(
# Javascript 处理不同源父窗口跨域传入的参数等。
tags$head(tags$script("
// 记录父窗口
parent = null;
window.addEventListener('message', function(e) {
//alert(e.data);
try{
//记录父窗口以备回发信息
parent = e.source;
//通知Shiny input已更新,触发reactive,observe,observeEvent等
//Shiny.setInputValue('freq', e.data, {priority:'event'});
Shiny.setInputValue('freq', e.data);
} catch (error){
alert(error);
}
},false);
// 点击时传出参数
$(document).on('click', '.btn-success', function (evt) {
evt.preventDefault();
//alert('click!');
if (parent == null){
alert('click!');
} else {
try{
var freq = document.getElementById('freq');
parent.postMessage(freq.value, '*');
} catch(error){
alert(error);
}
}
});
")),
textOutput("name"),
textOutput("MPG"),
sliderInput("freq",
"index:",
min = 1, max = length(row.names(mtcars)), value = 10, round = TRUE),
actionButton("sendout", "传出参数", class = "btn-success")
)
server <- function(input, output, session) {
# 响应输入的变化
freq<- reactive({
paste(input$freq)
})
# 更新文本
output$name <- renderText({
name<- row.names(mtcars)[input$freq]
})
# 更新文本
output$MPG <- renderText({
name<- row.names(mtcars)[input$freq]
paste(name, "'s mpg:", mtcars[name,]$mpg)
})
observe({
print(paste("observe triggered:",input$freq))
# 更新浏览器端JS Widget
updateSliderInput(session, "freq", value = freq())
})
observeEvent(freq(),{
print(paste("event triggered:",input$freq))
# 更新浏览器端JS Widget
updateSliderInput(session, "freq", value = freq())
})
}
shinyApp(ui, server)