如何在Shiny中使用输入键将两个响应式数据框联接?

4

我有两个响应式数据帧(为了说明方便,我创建了模拟数据帧),需要使用输入字段作为键在 shiny 中将它们连接起来。

library(shiny)
library(tidyverse)
df <- data.frame(key1=c(1:4),key2 = c(5:8),
                 left= c("l1", "l2", "l3", "l4"),
                 right = c("r1", "r2", "r3", "r4"))
left_df <- df[,1:3]
right_df <- df[,c(1:2,3)]

ui <- fluidPage(

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            selectInput("key_right", "Right Key", c("key1", "key2")),
            selectInput("key_left", "Right Key", c("key1", "key2"))
        ),

        mainPanel(
           tableOutput("final_data")
        )
    )
)


server <- function(input, output) {
    
    left_df2 <- reactive({
        left_df
    })
    
    rightt_df2 <- reactive({
        right_df
    })
    
     final_df <- reactive({
         left_df2() %>%
             left_join(right_df2(), by = c(input$key_right = input$key_left))
    })
     
     output$final_data <- reactive({
         final_df()
     })

}

我遇到了这个错误:
Error in parse(file, keep.source = FALSE, srcfile = src, encoding = enc) : 
  /app.R:37:60: unexpected '='
36:          left_df2() %>%
37:              left_join(right_df2(), by = c(input$key_right =
Error in sourceUTF8(fullpath, envir = new.env(parent = sharedEnv)) : 

我需要根据key1或key2执行联接,这应该是用户输入的,因为用户上传文件时可能有一个键或另一个键。
提前致谢!
1个回答

5

概述

     final_df <- reactive({
         left_df2() %>%
             left_join(right_df2(), by = setNames(input$key_right, input$key_left))
     })

我认为你的代码中键值颠倒了...第一个框架的keyname应该在=的左边,而不是像你在示例中所写的那样在右边。这就是为什么在下面的示例中我演示了在right_df中使用不同键名的原因之一。

解释

input$key_right = ... 实际上是一个 重新赋值 操作(覆盖了 input 列表的 key_right 属性的值),并不是你想要的操作。

为了清晰地演示,我将(1)修复right_df使其包括right列,以及(2)更改其key名称以使它们不同。

right_df <- df[,c(1:2,4)]
names(right_df)[1:2] <- c("key3", "key4")
right_df
#   key3 key4 right
# 1    1    5    r1
# 2    2    6    r2
# 3    3    7    r3
# 4    4    8    r4

从这里开始,一个静态连接可以是:

left_join(left_df, right_df, by = c("key1" = "key3"))
#   key1 key2 left key4 right
# 1    1    5   l1    5    r1
# 2    2    6   l2    6    r2
# 3    3    7   l3    7    r3
# 4    4    8   l4    8    r4

使用setNames将字符串"key3"赋值给名称为"key1"的变量,是一种等效的方式:
left_join(left_df, right_df, by = setNames("key3", "key1"))

使用这种方法的优点是可以从变量中以编程方式定义名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接