我正在编写一个R Shiny脚本,通过单击图表来删除不良数据点。流程如下:
目标#1:用户点击actionButton"删除",然后点击图表上的一个点。这一点是ymin,R删除任何小于该值的y值。 "删除" =声明为NA。
目标#2:相反,用户点击actionButton"删除上方",然后点击图表上的一个点。该点是ymax,R除去任何大于该值的y值。
以下是代码的简化版本:
library(shiny)
x = seq(0,10,length=50)
y = sin(x)
picked.style = "color: white; background-color: black"
ui = fluidPage(
plotOutput("y.trimmed", click = "plot_click"),
actionButton(inputId="b.above.pushed", label="Delete Above"),
actionButton(inputId="b.below.pushed", label="Delete Below")
)
server = function(input, output) {
v <- reactiveValues(
ymin = min( y, na.rm=T),
ymax = max(y, na.rm=T),
pick.bottun = "none"
)
############ push a button
# pick above
observeEvent(input$b.above.pushed, {
v$pick.bottun <- "above"
observeEvent(input$plot_click,
{v$ymax = input$plot_click$y}, ignoreInit = TRUE)
})
# pick below
observeEvent(input$b.below.pushed, {
v$pick.bottun <- "below"
observeEvent(input$plot_click,
{ v$ymin <- input$plot_click$y}, ignoreInit = TRUE)
})
############# update and replot data
output$y.trimmed <- renderPlot({
# clean data
print(paste("ymin=",round(v$ymin), "ymax=",round(v$ymax)) )
cc = y <= v$ymin & is.na(y)==F; y[cc] = NA
cc = y >= v$ymax & is.na(y)==F; y[cc] = NA
plot(x, y)
})
}
shinyApp(ui, server)
到目前为止,对于目标#1,它可以正常运行(即使你多次运行它)。同样,它适用于Objective#2。
如果要声明ymin然后声明ymax,则会出现问题。它会声明一个min就好了(假设让ymin = 0.1),但是为什么你要声明ymax(假设ymax = 0.5),它设置为ymin和ymax等于0.5。然后删除所有数据,导致代码崩溃。如果先声明ymax然后尝试设置ymin,则会发生同样的事情。
提前感谢您的帮助。
答案 0 :(得分:0)
你不想把observeEvent放在另一个。最好总是将它们放在服务器功能中,并让它们根据所选择的值做出反应。像这样。
library(shiny)
x = seq(0,10,length=50)
y = sin(x)
picked.style = "color: white; background-color: black"
ui = fluidPage(
plotOutput("y.trimmed", click = "plot_click"),
actionButton(inputId="b.above.pushed", label="Delete Above"),
actionButton(inputId="b.below.pushed", label="Delete Below")
)
server = function(input, output) {
v <- reactiveValues(
ymin = min( y, na.rm=T),
ymax = max(y, na.rm=T),
pick.bottun = "none"
)
############ push a button
# pick above
observeEvent(input$b.above.pushed, {
v$pick.bottun <- "above"
})
observeEvent(input$plot_click,
{
if(v$pick.bottun == "above"){
v$ymax = input$plot_click$y
} else if(v$pick.bottun == "below"){
v$ymin = input$plot_click$y
}
}, ignoreInit = TRUE)
# pick below
observeEvent(input$b.below.pushed, {
v$pick.bottun <- "below"
})
############# update and replot data
output$y.trimmed <- renderPlot({
# clean data
print(paste("ymin=",round(v$ymin), "ymax=",round(v$ymax)) )
cc = y <= v$ymin & is.na(y)==F; y[cc] = NA
cc = y >= v$ymax & is.na(y)==F; y[cc] = NA
plot(x, y)
})
}
shinyApp(ui, server)
希望这有帮助!