Блестящий вывод actionButton() в функции onRender() htmlWidgets
Моя цель - создать скрипт, в котором изначально отображается пустой график. Если пользователь нажимает на Shiny actionButton со словами "Добавить точки", то точки будут добавлены в график с помощью функции onRender() htmlWidgets. Это было бы эффективно, потому что фоновый пустой графически график не должен был бы быть повторно нанесен, когда пользователь выбирает Shiny actionButton.
Однако для этого мне нужно было бы найти способ указать на изменение Shiny actionButton непосредственно на функцию onRender(), чтобы пустой граф графика (в коде ниже, называемом "pP") не быть изменены вообще. Я поместил две прокомментированные строки в качестве оператора if в коде onRender() ниже, чтобы показать, к чему я стремлюсь.
Я знаю, что есть функция с именем Shiny.onInputChange('variable', variable), которая может вызываться внутри функции onRender() для сохранения переменной, созданной внутри onRender(), чтобы ее можно было использовать как ввод Shiny вне функция onRender(). Итак, я думаю, что я ищу что-то, что делает обратное (передает блестящее входное значение непосредственно в функцию 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)
Примечание. Это похоже на вопрос, который я задавал ранее ( используя функцию Shiny actionButton () в функции onRender() htmlWidgets). Однако я упростил вопрос и надеюсь определить, есть ли простой ответ, который может быть доступен.
1 ответ
Вы можете попробовать использовать 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
ДИВ:
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);
})
}