我的目标是创建一个脚本,最初显示一个空白的图表。如果用户点击Shiny actionButton说"添加点",那么点将通过htmlWidgets的onRender()函数添加到plotly图中。这将是有效的,因为当用户选择Shiny actionButton时,不需要重新绘制背景空白图表。
然而,为了让我实现这一点,我需要找出一种方法来指示Shiny actionButton中的变化直接进入onRender()函数,以便空白的plotly图形(在下面的代码中称为&# 34; pP")根本不会改变。我在下面的onRender()代码中将两条注释行作为if语句来显示我的目标。
我知道有一个名为Shiny.onInputChange('变量',变量)的函数可以在onRender()函数内调用,以保存在onRender()内创建的变量,这样就可以了像onRender()函数之外的Shiny输入一样使用。所以,我想我正在寻找反向的东西(将闪亮的输入值直接传递到onRender()函数中)。
ui <- shinyUI(fluidPage(
uiOutput("add"),
plotlyOutput("myPlot", height = 700)
))
server <- shinyServer(function(input, output) {
output$add <- renderUI({
actionButton("addButton", "Add points")
})
output$myPlot <- renderPlotly({
p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank()
pP <- ggplotly(p)
pP %>% onRender("
function(el, x, data) {
//if (input$addButton selected){
var Traces = [];
var trace = {
x: data.x,
y: data.y,
mode: 'markers',
marker: {
color: 'green',
size: 6
},
hoverinfo: 'none'
};
Traces.push(trace);
Plotly.addTraces(el.id, Traces);
//}
}", data = list(x = mtcars$wt, y = mtcars$mpg))
})
})
shinyApp(ui, server)
注意:这与我之前提到的问题类似(Using Shiny actionButton() function in onRender() function of htmlWidgets)。但是,我简化了问题,并希望确定是否有可用的简单答案。
答案 0 :(得分:2)
你可以尝试直接使用一些jQuery来响应用户点击按钮。 onRender
将是:
function(el, x, data) {
$('#addButton').on('click',function() {
var Traces = [];
var trace = {
x: data.x,
y: data.y,
mode: 'markers',
marker: {
color: 'green',
size: 6
},
hoverinfo: 'none'
};
Traces.push(trace);
Plotly.addTraces(el.id, Traces);
})
}
要实现此功能,首先需要创建按钮,因此我将ui.R
更改为:
ui <- shinyUI(fluidPage(
actionButton("addButton", "Add points"),
plotlyOutput("myPlot", height = 700)
))
编辑:如果您想保留renderUI
,可以使用事件委派来绑定#add
div中的功能按钮:
function(el, x, data) {
$('#add').on('click','button',function() {
var Traces = [];
var trace = {
x: data.x,
y: data.y,
mode: 'markers',
marker: {
color: 'green',
size: 6
},
hoverinfo: 'none'
};
Traces.push(trace);
Plotly.addTraces(el.id, Traces);
})
}