使用Shiny中的Crosstalk从DT表中选择行

时间:2018-01-13 08:06:38

标签: shiny dt

我承认,我在三天前在RStudio上发布了这个问题,但它还没有足够的爱,所以我在这里再试一次。我希望没关系。最初的问题在这里(两者中的文字相同,我只是透明)。 https://community.rstudio.com/t/selecting-rows-from-a-dt-table-using-crosstalk-in-shiny/4079

所以我想刷过D3Scatter中的点并使用它来过滤使用带有串扰的DT包生成的数据表的行。

就像这样,完全在闪亮之外起作用:

library(crosstalk)
library(d3scatter)
library(DT)

shared_iris <- SharedData$new(iris)

bscols(d3scatter(shared_iris, ~Petal.Length, ~Petal.Width, ~Species, width = "100%",
             x_lim = range(iris$Petal.Length), y_lim = range(iris$Petal.Width)),

   datatable(shared_iris))

但是当我把它放在Shiny中时,我可以从表格中选择分散点,但反之亦然:

library(shiny)
library(crosstalk)
library(d3scatter)
library(DT)

ui <- fluidPage(
  fluidRow(
    column(6, d3scatterOutput("scatter1")),
    column(6, DT::dataTableOutput("scatter2"))
  )
)

server <- function(input, output, session) {
  jittered_iris <- reactive({
    iris
  })

  shared_iris <- SharedData$new(jittered_iris)

  output$scatter1 <- renderD3scatter({
    d3scatter(shared_iris, ~Petal.Length, ~Petal.Width, ~Species, width = "100%",
          x_lim = range(iris$Petal.Length), y_lim = range(iris$Petal.Width))
  })

  output$scatter2 <- DT::renderDataTable({
    datatable(shared_iris)
  })
}

shinyApp(ui, server)

他们在这里工作:https://rstudio-pubs-static.s3.amazonaws.com/215948_95c1ab86ad334d2f82856d9e5ebc16af.html

我很茫然。我觉得我已经尝试了一切。有人提出任何线索吗?

谢谢,

1 个答案:

答案 0 :(得分:3)

DT中的串扰集成仅适用于客户端处理。使用DT::renderDataTable

尝试server = FALSE
library(shiny)
library(crosstalk)
library(d3scatter)
library(DT)

ui <- fluidPage(
  fluidRow(
    column(6, d3scatterOutput("scatter1")),
    column(6, DT::dataTableOutput("scatter2"))
  )
)

server <- function(input, output, session) {
  jittered_iris <- reactive({
    iris
  })

  shared_iris <- SharedData$new(jittered_iris)

  output$scatter1 <- renderD3scatter({
    d3scatter(shared_iris, ~Petal.Length, ~Petal.Width, ~Species, width = "100%",
              x_lim = range(iris$Petal.Length), y_lim = range(iris$Petal.Width))
  })

  output$scatter2 <- DT::renderDataTable({
    datatable(shared_iris)
  }, server = FALSE)
}

shinyApp(ui, server)

在使用Crosstalk与服务器端处理时,DT应该抛出错误

Error in widgetFunc: Crosstalk only works with DT client mode: DT::renderDataTable({...}, server=FALSE)

但我觉得这里打破了:https://github.com/rstudio/DT/commit/893708ca10def9cfe0733598019b62a8230fc52b

如果其他人没有,我猜可以提出这个问题。