我希望能够通过在图中选择数据点来删除它们。
此示例代码执行以下操作: 在Ui中,我创建2个selectInputs,用于控制x和y轴使用哪些数据。然后,我创建一个图并启用在图中选择点的功能。在该图下显示了当前选定的点。还有一个“ DeleteData”按钮,但该按钮尚未连接任何东西。
在服务器中,我创建一个数据框“ de”,并为x和y(XVar,YVar)轴分配ui的值。然后我尝试为主数据框创建一个反应性值
dePlot<-reactive({de})
此变量的目标是: 有时我想永久更改基础数据(例如,删除数据),然后我想写“ de”。有时我想要一个变量,每次都会将其重置为“ de”。观察者或输出事件。 我觉得我并没有以这种方式真正实现这个目标。
然后我创建情节。
然后是输出$ brush_info并观察事件。 “ output $ brush_info”获取dePlot的当前值,并且过滤器用于当前使用的x和y轴。这样,我不会删除图中未显示的数据。然后将选定的点发送到ui。
observe事件获取选定的值,并从数据框中过滤出每个选定的行,然后将其保存到主数据框“ 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)
})
})
答案 0 :(得分:0)
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
比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)