【问题标题】:Selecting data in shiny选择闪亮的数据
【发布时间】:2018-09-20 07:15:39
【问题描述】:

我想要一个 shinyApp 来创建一个新的数据框,其中的值是从另一个已经加载的数据框中选择的。

我已经尝试根据我在这里看到的一些帖子构建它,但仍然无法弄清楚。

这是df:

Names,ID
Adam,1234
Smith,4321
Frank,1111

这是我的代码:

library(data.table)
library(shiny)
#dataframe
names <- c("Adam", "Smith", "Frank")
id <- c(1234, 4321, 1111)
data <- data.table(names, id)

#empty dataframe
df <- data.frame(matrix(ncol = 2, nrow = 0))
x <- c("names", "id")
colnames(df) <- x

ui <- fluidPage(
  selectInput("names",
              "Names:",
              c("Search here...",
                data$names)),
  dataTableOutput("tabela")
)

server <- function(input, output, session) {
  df_subset <- reactive({
    df <- subset(data, names == input$names)
    return(df)
  })
  
output$tabela <- renderDataTable({df_subset()}) 

}

shinyApp(ui, server)

我希望用户在可视化名称时选择名称,然后他们单击操作按钮(我将在稍后处理)以在该新数据帧上运行脚本。

当我选择第一个名称时,它会将该值选择到表中,但当我选择另一个名称时会覆盖它。

它应该是这样的:

Select screen

After selecting one name

After selecting a second name

等等,所以他们可以选择任意数量的。 有人可以帮我吗? 谢谢

【问题讨论】:

  • 当您对 df 进行子集化时,所使用的列名不正确 - 它应该是 names 而不是 nomesselectInput 参数相同。另外,你为什么想要一个空的df,你可以直接将data 子集化为一个反应对象并显示它。显示不会改变data 本身。
  • 谢谢!我已经解决了。但仍然无法在没有覆盖问题的情况下运行该示例。我已经编辑了代码,你可以明白我的意思。

标签: r dataframe shiny subset


【解决方案1】:

这是一个命名错误,导致了您的错误。下面是工作示例。但是,您的 q 仍然不清楚,子集空数据框是什么意思?只是想让您知道,以防万一您不知道。当您使用renderDataTable 时,搜索框会根据您键入的内容自动划分子集。例如,如果您键入Adam,所有名称为 adam 的行将自动被子集化。

library(shiny)
library(data.table)

names <- c("Adam", "Smith", "Frank")
id <- c(1234, 4321, 1111)
data <- data.table(names, id)

ui <- fluidPage(selectInput("name",
                            "Names",
                            choices = unique(data$names)),

                dataTableOutput("table"))

server <- function(input, output, session) {
  #creating empty dataframe to be subsetted
  df <- data.frame(matrix(ncol = 2, nrow = 0))
  x <- c("names", "id")
  colnames(df) <- x

  df_subset <- reactive({
    a <- subset(df, names == input$name)
    return(a)
  })

  output$table <- DT::renderDataTable({
    df_subset()
  })
}

shinyApp(ui, server)

【讨论】:

  • 我需要用户可以从数据框中选择名称并在执行此操作时对其进行可视化。所以他所做的基本上是从另一个表中过滤数据。我希望我已经说清楚了。我将编辑为更小的版本,您可以更好地理解我的意思。
【解决方案2】:

数据框data 没有被覆盖——它是基于输入的“主动”子集——如果这有意义的话。呈现的dataTableOutput 正在发生变化,这是预期的行为。

此外,您不需要响应式df_subset,以下代码应该可以正常工作:

代码

library(data.table)
library(shiny)

names <- c("Adam", "Smith", "Frank")
id <- c(1234, 4321, 1111)
data <- data.table(names, id)
rm(names, id)

ui <- fluidPage(      
  fluidRow(
    column(12,
           h2("Original Table"),
           dataTableOutput("tabela")
           )
    ),
  fluidRow(
    column(8, 
           h2("Select Names for new table"),
           selectInput(inputId = "names", label = "Select Name", 
                       choices = data$names, multiple = T))
  ),
  fluidRow(
    column(12, 
           h2("Subset Table"),
           dataTableOutput("tabelb"))
  )

)

server <- function(input, output, session) {
  output$tabela <- renderDataTable({return(data)})
  output$tabelb <- renderDataTable({return(data[ names %in% input$names])})       
}

shinyApp(ui, server)

输出

在此处查看答案:R shiny - save chosen values in selectInput,您可能希望将reactiveValues 保存为会话 - 看起来更优雅。

【讨论】:

  • 您好!谢谢你的回答。但是我刚刚尝试了您提供的代码,但并没有像我期望的那样工作。我需要将我从选项中选择的名称添加到正在打印的数据框“df”中。例如,选择名字将只打印第一个。当我选择第二个名称时,它会显示前一个名称和我选择的另一个名称。
  • 知道了,那么您想查看两张表,而不是一张。并且需要两个输出对象。
  • 我想是的!我已经上传了一些图片,我认为它会更加清楚
  • 哇,非常感谢!此外,我想问你这些问题: >第一:选择名称时,他们会一直填写选择框。难道没有办法让他们消失吗?因为我要处理的原始 df 有数千个名称,所以在选择大量名称后可能会有点混乱。 >第二:这个新的子集df保存在哪里?稍后我将在该 df 上运行一个脚本。例如:dim(subsettable)
  • 对于第一部分,您应该查看reactiveValues 以存储所有选定的选项。例如,您可以选择 5 个名称,然后单击“保存”将它们存储到 reactiveValues 对象(此处为 tableb)。在当前代码中,仅显示子集数据,不保存。您可以添加downloadButtonactionButton 对象,这会将tableb 的当前形式写入文件。在 Shiny 网站上查找这些功能 - 有很多关于生成与您正在寻找的内容相匹配的报告的示例。
猜你喜欢
  • 2018-10-01
  • 2019-11-11
  • 1970-01-01
  • 2018-09-23
  • 2017-02-20
  • 2020-08-12
  • 2013-09-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多