我一直通过多面数据在Shiny中祝好运。我创建了图,并在图下方的表中显示了选定的(即刷过的)数据。
我最近尝试对稍微复杂一些的数据执行相同的操作。我想在数据中选择一个字段,然后针对该字段生成所有数据的图。我通过this Stack Overflow post 学习了如何做到这一点。
当我将其放入应用程序时,它似乎可以正常工作,除了我注意到在某些绘图上,1)当我尝试选择所有点时,没有一个点出现(如下),或者
... 2)如果我尝试选择空白区域,则所有数据都被选中(如下)。
在我看来,笔刷坐标未正确转换为数据坐标。例如,以下是“ disp”图中的一些数据,显示为失败(按值排序-最小值为71.1):
mpg var value
33.9 disp 71.1
30.4 disp 75.7
32.4 disp 78.7
27.3 disp 79.0
30.4 disp 95.1
22.8 disp 108.0
当我尝试选择显示图中的所有点(即第一张图像)时,笔刷的值都低于(xmin,xmax,ymin和ymax都与我的选择匹配)。但是,我不知道如何将绘制的框坐标转换为数据选择-我真的不在这里了:
> fancybrush
$`xmin`
[1] 51.18154
$xmax
[1] 482.1583
$ymin
[1] 9.225
$ymax
[1] 35.075
$panelvar1
[1] "disp"
$coords_css
$coords_css$`xmin`
[1] 721
$coords_css$xmax
[1] 898
$coords_css$ymin
[1] 24.24657
$coords_css$ymax
[1] 121.9497
$coords_img
$coords_img$`xmin`
[1] 721
$coords_img$xmax
[1] 898
$coords_img$ymin
[1] 24.24657
$coords_img$ymax
[1] 121.9497
img_css_ratio
$img_css_ratio$`x`
[1] 1
$img_css_ratio$y
[1] 1
$mapping
$mapping$`x`
[1] "value"
$mapping$y
[1] "mpg"
$mapping$panelvar1
[1] "var"
$domain
$domain$`left`
[1] -23.6
$domain$right
[1] 495.6
$domain$bottom
[1] 9.225
$domain$top
[1] 35.075
$range
$range$`left`
[1] 690.2876
$range$right
[1] 903.5204
$range$bottom
[1] 121.9497
$range$top
[1] 24.24657
$log
$log$`x`
NULL
$log$y
NULL
$direction
[1] "xy"
$brushId
[1] "fancybrush"
$outputId
[1] "fancyPlot"
这对我来说有点麻烦,但是我似乎已经足够亲密了,我很确定这是可能的。如果有人能建议我可能需要做些什么来解决它,我很想听听您的消息。
下面是我可以制作的最小的,可重现的示例代码,它说明了“简单”构面(可正常工作)在“花式”构面正上方,但失败了。在一些地方设置了全局变量,以便可以看到这些值。
很长一段时间后的道歉-希望我尽可能清楚。感谢您阅读本文。
library(shiny)
ui <- fluidPage(
div(h1("Simple Facet"),p("These plots facet mtcars by CYL", plotOutput("simpleFacetPlot",brush = "simplebrush"), dataTableOutput("simpleFacetTable"))),
div(h1("Fancy Facet"),p("These plots plot all other columns against MPG", plotOutput("fancyPlot",brush = "fancybrush"), dataTableOutput("fancyTable")))
)
server <- function(input, output) {
##### functions to get the data
getSimpleData <-function(){
thisData = mtcars
thisData<<-thisData
return(thisData)
}
getFancyData <-function(coreField = NULL){
thisData = mtcars
thisData = thisData[!is.na(thisData[coreField]),]
thisDataRes = thisData %>% gather(-coreField , key = "var", value = "value")
thisDataRes<<-thisDataRes
return(thisDataRes)
}
##### blocks to watch for the selections
simpleSelected <- reactive({
input$simplebrush
thisSimpleData = getSimpleData()
simpleBrushed=brushedPoints(thisSimpleData,
input$simplebrush,
xvar = "wt",
yvar = "mpg")
return(simpleBrushed)
})
fancySelected <- reactive({
input$fancybrush
fancybrush<<-input$fancybrush
thisFancyData = getFancyData(coreField = 'mpg')
fancyBrushed=brushedPoints(thisFancyData,
input$fancybrush,
xvar = "var",
yvar = "mpg")
return(fancyBrushed)
})
##### blocks to generate the plots
output$simpleFacetPlot <- renderPlot({
#just force faceting on cylinder for the simple plot
simpleFacetPlot = ggplot(data = getSimpleData(), aes(x = wt, y = mpg)) + geom_point() + facet_wrap(~ cyl)
return(simpleFacetPlot)
})
output$fancyPlot <- renderPlot({
fancyPlot <- ggplot(data = getFancyData(coreField = 'mpg'), aes(x = value, y = mpg)) + geom_point() + facet_wrap(~ var)
return(fancyPlot)
})
#####blocks to print the selection output
output$fancyTable <- renderDataTable({
return(fancySelected())
})
output$simpleFacetTable <- renderDataTable({
return(simpleSelected())
})
}
shinyApp(ui = ui, server = server)