R:如何从左到右查看两个数据表,以及如何突出显示不同的值

R:如何从左到右查看两个数据表,以及如何突出显示不同的值,r,shiny,R,Shiny,我正在开发一个R闪亮的应用程序,有两个数据框,emp.data_a和emp.data_B,我可以通过从下拉选项中选择一个来访问。除此之外,我希望在一个视图中看到左侧(emp.data_a)和右侧(emp.data_B)方向的两个数据帧 在emp.data_B中,我还希望突出显示与两个数据帧不同的值(示例列Salary) 我的代码: library(shiny) emp.data_A <- data.frame( emp_id = c(1:5), emp_name = c(&quo

我正在开发一个R闪亮的应用程序,有两个数据框,emp.data_a和emp.data_B,我可以通过从下拉选项中选择一个来访问。除此之外,我希望在一个视图中看到左侧(emp.data_a)和右侧(emp.data_B)方向的两个数据帧

在emp.data_B中,我还希望突出显示与两个数据帧不同的值(示例列Salary)

我的代码:

library(shiny)

emp.data_A <- data.frame(
  emp_id = c(1:5),
  emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),
  salary = c(623.3,515.2,611.0,735.0,844.25))

emp.data_A


emp.data_B <- data.frame(
  emp_id = c(1:5),
  emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),
  salary = c(623.3,515.2,611.0,729.0,843.25))
emp.data_B


shinyApp(
  ui = tagList(
    navbarPage(
      selectInput("dataset5", "Choose a dataset:",
                  choices = c("SelectDataSet ", "emp.data_A", "emp.data_B")),
      # Button
      downloadButton("downloadData5", "Download")
    ),
    mainPanel(
      tableOutput("table5")
    )
  ),
  
  server = function(input, output,session) {
    datasetInput <- reactive({
      switch(input$dataset5,
             "emp.data_A" = emp.data_A,
             "emp.data_B" = emp.data_B)
    })
    output$table5 <- renderTable({
      datasetInput()
    })
    
  }
)
shinyApp(ui, server)
库(闪亮)

emp.data\u A这里是一个使用
gt
的工作演示

首先,要并排设置两列,可以在
fluidRow
中设置列宽。我在
selectInput
中添加了“两者”作为选项,如果选中,将显示两个表。否则,将仅显示所选的表A或表B。有许多替代方法可以使用Shining来布局
ui
。如果您还没有阅读,我建议您重新阅读

第二,要包含不同的高亮显示,可以考虑使用<代码> DT/<代码>或<代码> GT包。使用

DT
可以将
rowCallback
与javascript一起使用,并添加一个函数来确定要高亮显示的单元格。使用下面的
gt
示例,您可以使用
tab_样式
高亮显示表格中的单元格

在本例中,我使用
创建了一个简单的矩阵,指示两个数据帧之间差异的行和列。然后,在这个矩阵中循环,我为每个行/列组合添加了重复的
tab\u样式
,并设置为黄色。请注意,仅当选择“两者”时,第二个表格显示突出显示的差异。但是,您可以更改此设置以满足您的需要

library(shiny)
library(gt)

shinyApp(
  ui = fluidPage(
    fluidRow(
      selectInput("dataset5", 
                  "Choose a dataset:",
                  choices = c("SelectDataSet", "both", "emp.data_A", "emp.data_B")),
      downloadButton("downloadData5", "Download")
    ),
    hr(),
    fluidRow(
      column(width = 6, gt_output("table1")),
      column(width = 6, gt_output("table2"))
    )
  ),
  server = function(input, output,session) {
    datasetInput1 <- reactive({
      if (input$dataset5 == "both" || input$dataset5 == "emp.data_A") {
        emp.data_A 
      } else if (input$dataset5 == "emp.data_B") {
        emp.data_B 
      }
    })
    datasetInput2 <- reactive({
      if (input$dataset5 == "both") {
        tbl_diffs <- which(emp.data_A != emp.data_B, arr.ind = TRUE)
        tbl_gt_B <- emp.data_B %>% 
          gt()
        for (i in seq_len(nrow(tbl_diffs))) {
          tbl_gt_B <- tbl_gt_B %>%
            tab_style(
              style = list(
                cell_fill(color = "#FFFF00")
              ),
              locations = cells_body(
                columns = tbl_diffs[[i, "col"]],
                rows = tbl_diffs[[i, "row"]]
              )
            )
        }
        tbl_gt_B
      }
    })
    output$table1 <- render_gt(
      datasetInput1() 
    )
    output$table2 <- render_gt(
      datasetInput2()
    )
  }
)
库(闪亮)
图书馆(gt)
shinyApp(
ui=fluidPage(
fluidRow(
选择输入(“数据集5”,
“选择数据集:”,
choices=c(“SelectDataSet”、“两者”、“emp.data\u A”、“emp.data\u B”),
下载按钮(“下载数据5”,“下载”)
),
hr(),
fluidRow(
列(宽度=6,gt_输出(“表1”),
列(宽度=6,gt_输出(“表2”))
)
),
服务器=功能(输入、输出、会话){

datasetInput1这里是一个使用
gt
的工作演示

首先,要并排设置两列,可以在
fluidRow
中设置列宽作为
selectInput
的一个选项,如果选中,将显示两个表。否则,将仅显示所选的表A或表B。有许多替代方法可以使用shiny来布局
ui
。如果您尚未查看,我建议您查看

第二,包含不同的高亮显示,你可以考虑使用<代码> DT 或<代码> GT包。使用<代码> DT < /代码>,可以使用JavaScript使用<代码> ROLLACKBACK/<代码>,并添加一个函数来确定要突出显示的单元格。下面使用<代码> GT示例,可以使用<代码> TabyStase<代码>来突出显示单元格中的单元格。你的桌子

在本例中,我使用
创建了一个简单的矩阵,指示两个数据帧之间的行和列的差异。然后,通过该矩阵,我添加了
选项卡样式
,对每一行/列组合重复,并设置为黄色。注意,只有在“两者”时选择,第二个表显示突出显示的差异。但是,您可以更改此选项以满足您的需要

library(shiny)
library(gt)

shinyApp(
  ui = fluidPage(
    fluidRow(
      selectInput("dataset5", 
                  "Choose a dataset:",
                  choices = c("SelectDataSet", "both", "emp.data_A", "emp.data_B")),
      downloadButton("downloadData5", "Download")
    ),
    hr(),
    fluidRow(
      column(width = 6, gt_output("table1")),
      column(width = 6, gt_output("table2"))
    )
  ),
  server = function(input, output,session) {
    datasetInput1 <- reactive({
      if (input$dataset5 == "both" || input$dataset5 == "emp.data_A") {
        emp.data_A 
      } else if (input$dataset5 == "emp.data_B") {
        emp.data_B 
      }
    })
    datasetInput2 <- reactive({
      if (input$dataset5 == "both") {
        tbl_diffs <- which(emp.data_A != emp.data_B, arr.ind = TRUE)
        tbl_gt_B <- emp.data_B %>% 
          gt()
        for (i in seq_len(nrow(tbl_diffs))) {
          tbl_gt_B <- tbl_gt_B %>%
            tab_style(
              style = list(
                cell_fill(color = "#FFFF00")
              ),
              locations = cells_body(
                columns = tbl_diffs[[i, "col"]],
                rows = tbl_diffs[[i, "row"]]
              )
            )
        }
        tbl_gt_B
      }
    })
    output$table1 <- render_gt(
      datasetInput1() 
    )
    output$table2 <- render_gt(
      datasetInput2()
    )
  }
)
库(闪亮)
图书馆(gt)
shinyApp(
ui=fluidPage(
fluidRow(
选择输入(“数据集5”,
“选择数据集:”,
choices=c(“SelectDataSet”、“两者”、“emp.data\u A”、“emp.data\u B”),
下载按钮(“下载数据5”,“下载”)
),
hr(),
fluidRow(
列(宽度=6,gt_输出(“表1”),
列(宽度=6,gt_输出(“表2”))
)
),
服务器=功能(输入、输出、会话){

datasetInput1您是否可以更清楚地了解您希望Shiny显示的内容?您是否可以给出预期的输出?要更清楚:我想有一个选择,在单个视图中从左到右显示两个数据帧..可能吗?您所说的“突出显示两个数据帧不同的值”是什么意思?emp.data_a和emp.data_B的Salary列中的数字存在差异,我希望强调这一点。我已经编辑了代码,请检查您是否可以更清楚地了解您希望Shiny显示的内容?您是否可以给出预期的输出?更清楚地说:我想有一个选择来显示左侧和右侧的数据帧n单个视图..可能吗?您所说的“突出显示与两个数据帧不同的值”是什么意思?emp.data_a和emp.data_B的工资列中的数字存在差异,我希望突出显示。我已编辑代码,请检查