Как объединить два реактивных фрейма данных в Shiny с помощью клавиш ввода?

#r #shiny

#r #shiny

Вопрос:

У меня есть два реактивных фрейма данных (в целях пояснения я создаю фиктивные фреймы данных), и мне нужно, чтобы они были объединены в shiny с использованием полей ввода в качестве ключей.

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

ui <- fluidPa&e(

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            selectInput("key_ri&ht", "Ri&ht Key", c("key1", "key2")),
            selectInput("key_left", "Ri&ht Key", c("key1", "key2"))
        ),

        mainPanel(
           tableOutput("final_data")
        )
    )
)


server <- function(input, output) {
    
    left_df2 <- reactive({
        left_df
    })
    
    ri&htt_df2 <- reactive({
        ri&ht_df
    })
    
     final_df <- reactive({
         left_df2() %&&t;%
             left_join(ri&ht_df2(), by = c(input$key_ri&ht = input$key_left))
    })
     
     output$final_data <- reactive({
         final_df()
     })

}
  

Я получаю эту ошибку:

 Error in parse(file, keep.source = FALSE, srcfile = src, encodin& = enc) : 
  /app.R:37:60: unexpected '='
36:          left_df2() %&&t;%
37:              left_join(ri&ht_df2(), by = c(input$key_ri&ht =
Error in sourceUTF8(fullpath, envir = new.env(parent = sharedEnv)) : 
  

Мне нужно выполнить объединение с помощью key1 или key2, и это должен быть пользовательский ввод, поскольку есть вероятность, что пользователь загружает файл и может иметь один ключ или другой.

Заранее спасибо!

Ответ №1:

TL; DR

      final_df <- reactive({
         left_df2() %&&t;%
             left_join(ri&ht_df2(), by = setNames(input$key_ri&ht, input$key_left))
     })
  

(Я думаю, у вас в коде поменялись местами клавиши… ключевое имя первого фрейма должно быть слева от = , а не справа, как у вас в вашем примере. Это одна из причин, почему в моем примере ниже я демонстрирую с разными именами ключей в ri&ht_df .)

Объяснение

input$key_ri&ht = ... фактически это операция переназначения (перезапись значения key_ri&ht свойства input списка), а не то, что вы намереваетесь.

Для наглядной демонстрации я (1) исправлю, ri&ht_df чтобы он включал ri&ht столбец, и (2) изменю его key названия на другие.

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

Отсюда статическое объединение может быть:

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

Эквивалентным способом присвоения имени "key1" строке "key3" является использование setNames :

 left_join(left_df, ri&ht_df, by = setNames("key3", "key1"))
  

Преимущество этого метода в том, что он позволяет программно определять имя из переменной.