闪亮筛选应用程序 - 用户筛选/变异/修改
Shiny Screening App - User Filter / Mutate / Modify
我正在创建一个闪亮的筛选应用程序,它允许用户在预定的数据帧上键入 filter
和 mutate
等 R 命令。
就个人而言,我认为最用户友好的方法是使用包含筛选参数的空白数据框列,用户可以在其中输入 filter(mpg >= 21)
或 mutate(cyl_sq = cyl^2)
等命令,使用 mtcars
数据集为例。
显示预期功能的简单应用程序:
library(shiny)
library(shinydashboard)
library(DT)
library(dplyr)
# Header ------------------------------------------------
header <- dashboardHeader(title = "Example Screening")
# Sidebar ------------------------------------------------
sidebar <- dashboardSidebar()
# Body ------------------------------------------------
body <-
dashboardBody(
fluidRow(
column(6,h3("Screening Parameters")),
column(6,h3("Filtered/Modified Results"))),
fluidRow(
column(6,DT::dataTableOutput("screening_params")),
column(6,DT::dataTableOutput("filtered_results")))
)
# APP ------------------------------------------------
shinyApp(ui <- dashboardPage(
header,
sidebar,
body
),
# Server ----------------------------------------------------------
shinyServer(function(input,output){
output$screening_params <- renderDataTable({
tibble(params = c("filter(mpg >= 21)",
"mutate(cyl_sq = cyl^2)",
rep_len(NA_character_,8))) %>%
DT::datatable(rownames = F,
editable = T)
})
output$filtered_results <- renderDataTable({
mtcars %>%
# input$screening_params
DT::datatable()
})
}))
我愿意使用 DT
或 rhandsontable
或任何人能想到的替代方法。不幸的是,您似乎无法在 DT
中获取编辑后的 table 值,但希望它能提供一个很好的例子来说明我所追求的。
我已经尝试了所有我能想到的quosures和映射函数的组合,但都没有用。
有人有什么想法吗?
这是一种略有不同的方法,但您可能会发现它很有用。我使用 sqldf
作为 SQL 查询引擎,用户可以在给定数据集上使用临时 SQL 查询来操作数据。如果这不是你想要的,我至少希望它能给你一些关于如何使用 dplyr
语法来完成它的提示。
如果你仍然选择 dplyr
选项并且你有一个带有请求操作的字符串,你可以使用反应式方法 getDataset
来评估你从用户那里收到的表达式,操作你的数据集。然后在 renderDataTable
方法中调用 getDataset
,就像我在附加代码中所做的那样。
评估字符串表达式的示例:
eval(parse(text="res <- mtcars %>% filter(mpg < 20)"))
对于 SQL 选项:
library(shiny)
library(shinydashboard)
library(DT)
library(dplyr)
library(sqldf)
# Header ------------------------------------------------
header <- dashboardHeader(title = "Example Screening")
# Sidebar ------------------------------------------------
sidebar <- dashboardSidebar(collapsed = TRUE)
# Body ------------------------------------------------
body <-
dashboardBody(
fluidRow(
#column(6,h3("Screening Parameters")),
column(6,h3("Filtered/Modified Results"))),
fluidRow(
textInput("sql","SQL Query",value = "SELECT * FROM dataset"),
DT::dataTableOutput(("filtered_results"))
)
)
# APP ------------------------------------------------
shinyApp(ui <- dashboardPage(
header,
sidebar,
body
),
# Server ----------------------------------------------------------
shinyServer(function(input,output){
## A new function to load data and perform the SQL query on it
getDataset <- reactive({
query <- input$sql
dataset <- mtcars
sqldf::sqldf(query)
})
output$filtered_results <- renderDataTable({
getDataset() %>%
DT::datatable()
})
}))
感谢 Omri374 与我交流想法。
满足要求的简单应用:
library(shinydashboard)
library(DT)
library(dplyr)
library(rhandsontable)
# Header ------------------------------------------------
header <- dashboardHeader(title = "Example Screening")
# Sidebar ------------------------------------------------
sidebar <- dashboardSidebar()
# Body ------------------------------------------------
body <-
dashboardBody(
fluidRow(
column(6,h3("Screening Parameters")),
column(6,h3("Filtered/Modified Results"))),
fluidRow(
column(6, rHandsontableOutput("hot")),
column(6, dataTableOutput("filtered_results")))
)
# APP ------------------------------------------------
shinyApp(ui <- dashboardPage(
header,
sidebar,
body
),
# Server ----------------------------------------------------------
shinyServer(function(input,output){
output$hot <- renderRHandsontable({
tibble(params = c("filter(mpg >= 21)",
"filter(cyl == 4)",
"mutate(cyl_sq = cyl^2)",
"select(cyl,mpg,drat)",
rep_len(NA_character_,6))) %>%
rhandsontable() %>%
hot_cols(colWidths = 500)
})
output$filtered_results <- renderDataTable({
df <- mtcars
params <- input$hot %>%
hot_to_r() %>%
filter(!is.na(params),params != "") %>%
mutate(params = ifelse(row_number() == max(row_number()),
params,
paste0(params," %>% "))) %>%
pull(params) %>%
str_c(collapse = "")
if(length(params)>=1){
eval(parse(text = paste0("filt_df <- df %>%",params)))
} else {
filt_df <- df
}
filt_df %>%
datatable()
})
}))
我正在创建一个闪亮的筛选应用程序,它允许用户在预定的数据帧上键入 filter
和 mutate
等 R 命令。
就个人而言,我认为最用户友好的方法是使用包含筛选参数的空白数据框列,用户可以在其中输入 filter(mpg >= 21)
或 mutate(cyl_sq = cyl^2)
等命令,使用 mtcars
数据集为例。
显示预期功能的简单应用程序:
library(shiny)
library(shinydashboard)
library(DT)
library(dplyr)
# Header ------------------------------------------------
header <- dashboardHeader(title = "Example Screening")
# Sidebar ------------------------------------------------
sidebar <- dashboardSidebar()
# Body ------------------------------------------------
body <-
dashboardBody(
fluidRow(
column(6,h3("Screening Parameters")),
column(6,h3("Filtered/Modified Results"))),
fluidRow(
column(6,DT::dataTableOutput("screening_params")),
column(6,DT::dataTableOutput("filtered_results")))
)
# APP ------------------------------------------------
shinyApp(ui <- dashboardPage(
header,
sidebar,
body
),
# Server ----------------------------------------------------------
shinyServer(function(input,output){
output$screening_params <- renderDataTable({
tibble(params = c("filter(mpg >= 21)",
"mutate(cyl_sq = cyl^2)",
rep_len(NA_character_,8))) %>%
DT::datatable(rownames = F,
editable = T)
})
output$filtered_results <- renderDataTable({
mtcars %>%
# input$screening_params
DT::datatable()
})
}))
我愿意使用 DT
或 rhandsontable
或任何人能想到的替代方法。不幸的是,您似乎无法在 DT
中获取编辑后的 table 值,但希望它能提供一个很好的例子来说明我所追求的。
我已经尝试了所有我能想到的quosures和映射函数的组合,但都没有用。
有人有什么想法吗?
这是一种略有不同的方法,但您可能会发现它很有用。我使用 sqldf
作为 SQL 查询引擎,用户可以在给定数据集上使用临时 SQL 查询来操作数据。如果这不是你想要的,我至少希望它能给你一些关于如何使用 dplyr
语法来完成它的提示。
如果你仍然选择 dplyr
选项并且你有一个带有请求操作的字符串,你可以使用反应式方法 getDataset
来评估你从用户那里收到的表达式,操作你的数据集。然后在 renderDataTable
方法中调用 getDataset
,就像我在附加代码中所做的那样。
评估字符串表达式的示例:
eval(parse(text="res <- mtcars %>% filter(mpg < 20)"))
对于 SQL 选项:
library(shiny)
library(shinydashboard)
library(DT)
library(dplyr)
library(sqldf)
# Header ------------------------------------------------
header <- dashboardHeader(title = "Example Screening")
# Sidebar ------------------------------------------------
sidebar <- dashboardSidebar(collapsed = TRUE)
# Body ------------------------------------------------
body <-
dashboardBody(
fluidRow(
#column(6,h3("Screening Parameters")),
column(6,h3("Filtered/Modified Results"))),
fluidRow(
textInput("sql","SQL Query",value = "SELECT * FROM dataset"),
DT::dataTableOutput(("filtered_results"))
)
)
# APP ------------------------------------------------
shinyApp(ui <- dashboardPage(
header,
sidebar,
body
),
# Server ----------------------------------------------------------
shinyServer(function(input,output){
## A new function to load data and perform the SQL query on it
getDataset <- reactive({
query <- input$sql
dataset <- mtcars
sqldf::sqldf(query)
})
output$filtered_results <- renderDataTable({
getDataset() %>%
DT::datatable()
})
}))
感谢 Omri374 与我交流想法。
满足要求的简单应用:
library(shinydashboard)
library(DT)
library(dplyr)
library(rhandsontable)
# Header ------------------------------------------------
header <- dashboardHeader(title = "Example Screening")
# Sidebar ------------------------------------------------
sidebar <- dashboardSidebar()
# Body ------------------------------------------------
body <-
dashboardBody(
fluidRow(
column(6,h3("Screening Parameters")),
column(6,h3("Filtered/Modified Results"))),
fluidRow(
column(6, rHandsontableOutput("hot")),
column(6, dataTableOutput("filtered_results")))
)
# APP ------------------------------------------------
shinyApp(ui <- dashboardPage(
header,
sidebar,
body
),
# Server ----------------------------------------------------------
shinyServer(function(input,output){
output$hot <- renderRHandsontable({
tibble(params = c("filter(mpg >= 21)",
"filter(cyl == 4)",
"mutate(cyl_sq = cyl^2)",
"select(cyl,mpg,drat)",
rep_len(NA_character_,6))) %>%
rhandsontable() %>%
hot_cols(colWidths = 500)
})
output$filtered_results <- renderDataTable({
df <- mtcars
params <- input$hot %>%
hot_to_r() %>%
filter(!is.na(params),params != "") %>%
mutate(params = ifelse(row_number() == max(row_number()),
params,
paste0(params," %>% "))) %>%
pull(params) %>%
str_c(collapse = "")
if(length(params)>=1){
eval(parse(text = paste0("filt_df <- df %>%",params)))
} else {
filt_df <- df
}
filt_df %>%
datatable()
})
}))