Я хочу иметь возможность удалять точки данных, выбирая их на графике.
Этот примерный код делает следующее: В пользовательском интерфейсе я создаю 2 selectInputs, которые контролируют, какие данные используются для осей x и y. Затем я создаю график и включаю выбор точек на графике. Под графиком показаны выбранные в данный момент точки. Есть еще кнопка "УдалитьДанные", но она пока ни к чему не подключена.
На сервере я создаю фрейм данных "de" и назначаю оси x и y (XVar, YVar) значения пользовательского интерфейса. Затем я пытаюсь создать реактивное значение для основного фрейма данных.
dePlot<-reactive({de})
Моя цель с этими переменными: Иногда я хочу навсегда изменить базовые данные (например, удалить данные), тогда я хочу написать «de». Иногда мне нужна переменная, которая каждый раз сбрасывается на «de» в каждом, например. наблюдатель или выходное событие. У меня такое чувство, что я на самом деле не достигаю этой цели таким образом.
Затем я создаю сюжет.
Затем следует событие output$brush_info и наблюдения. "output$brush_info" получает текущее значение dePlot и фильтры для используемых в настоящее время осей x и y. Таким образом, я не удаляю данные, которые в данный момент не отображаются на графике. А затем выбранные точки отправляются в пользовательский интерфейс.
Событие наблюдения берет выбранные значения и фильтрует каждую выбранную строку из фрейма данных, а затем сохраняет ее в основной фрейм данных «de». То
print(de)
показывает мне, что фильтрация работает по назначению. Но на самом деле это не обновляет «de» и, следовательно, не «dePlot», поэтому мой сюжет остается неизменным. Я предполагаю, что это потому, что я «пойман» в событии наблюдения и не могу передать оттуда переменные. У меня такое чувство, что я действительно близок, но просто недостаточно понимаю реактивные ценности, чтобы закончить это.
Надеюсь, я сделал проблему не слишком запутанной, и любая помощь приветствуется.
Мой пользовательский интерфейс
library("shiny")
library("shinyFiles")
library("shinydashboard")
library("shinyBS")
library("plotly")
library("jpeg")
library("imager")
shinyUI(
dashboardPage(
dashboardHeader(disable = T),
dashboardSidebar(width = 200,
sidebarMenu(width=3,
menuItem(startExpanded = T,
selectInput("XVar","Please Select X-Axis",
choices=c("eins","zwei","drei"),selected = "eins"),
selectInput("YVar","Please Select Y-Axis",
choices=c("eins","zwei","drei"),selected = "zwei")
)
)
),
dashboardBody(width=9,
tabItem(tabName = 'box2',
tabBox(width = 16,
tabPanel("Long time data",plotOutput("myPlot", click = "plot1_click",brush = brushOpts(id = "plot1_brush"))
,actionButton('DeleteData?','DeleteSelectedData'),column(width = 6,h4("Brushed points"),verbatimTextOutput("brush_info"))
)
)
)
)
)
)
Мой сервер
shinyServer(function(input, output,session){
eins<-c(1,2,3,4,5,6,7,8,9,10)
zwei<-c(4,6,3,4,400,-500,900,8,12,5)
drei<-c(989,663,74,543,222,1541,1515,12,525,21)
isolate({de<-data.frame(eins,zwei,drei)})
XVar<-reactive({input$XVar})
YVar<-reactive({input$YVar})
dePlot<-reactive({de})
output$myPlot <-renderPlot({
ggplot(data=dePlot())+
geom_line(aes_string(x=XVar(),y=YVar()
)
)
})
output$brush_info <- renderPrint({
deBrush<-dePlot()[,c(XVar(),YVar())]
brushedPoints(deBrush, input$plot1_brush)
})
observe({
Var1<-brushedPoints(dePlot(), input$plot1_brush,allRows = TRUE)
Var12<-as.numeric((row.names(Var1[Var1$selected_==TRUE,])))
de<-dePlot()[-Var12,]
print(de)
})
})
library(shiny)
library(shinydashboard)
library(ggplot2)
В ui
меняется почти только стиль:
ui <- dashboardPage(
dashboardHeader(disable = TRUE),
dashboardSidebar(
width = 200,
sidebarMenu(
width = 3,
menuItem(
startExpanded = TRUE,
selectInput("XVar", "Please Select X-Axis",
choices = c("eins", "zwei", "drei"), selected = "eins"),
selectInput("YVar","Please Select Y-Axis",
choices = c("eins", "zwei", "drei"), selected = "zwei")
)
)
),
dashboardBody(
width=9,
tabItem(
tabName = 'box2',
tabBox(
width = 16,
tabPanel(
"Long time data",
plotOutput("myPlot", click = "plot1_click",
brush = brushOpts(id = "plot1_brush")),
actionButton('DeleteSelectedData', 'DeleteData ? '),
actionButton('ResetData', 'Reset data'),
column(
width = 6,
h4("Brushed points"),
verbatimTextOutput("brush_info"))
)
)
)
)
)
input$...
не нужно заворачивать reactive({ })
reactiveVal()
для этогоactionButton
s легче контролировать с помощью observeEvent()
, чем observe()
server <- function(input, output, session) {
eins <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
zwei <- c(4, 6, 3, 4, 400, -500, 900, 8, 12, 5)
drei <- c(989, 663, 74, 543, 222, 1541, 1515, 12, 525, 21)
de <- data.frame(eins, zwei, drei)
rx_de <- reactiveVal(de)
output$myPlot <- renderPlot({
ggplot(data = rx_de()) +
geom_line(aes_string(x = input$XVar, y = input$YVar))
})
output$brush_info <- renderPrint({
brushedPoints(rx_de(), input$plot1_brush)[, c(input$XVar, input$YVar)]
})
observeEvent(input$DeleteSelectedData, {
Var1 <- brushedPoints(rx_de(), input$plot1_brush, allRows = TRUE)
rx_de(Var1[!Var1$selected_, names(Var1) != "selected_", drop = FALSE])
})
observeEvent(input$ResetData, {
rx_de(de)
})
}
shinyApp(ui, server)