#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"))
Преимущество этого метода в том, что он позволяет программно определять имя из переменной.