используя pickerInput в r блестящий, чтобы применить функцию - PullRequest
0 голосов
/ 16 января 2020

Я хотел бы иметь возможность применить функцию к заданному набору столбцов из набора данных RLdata10000. Я прошёл блестящие уроки и пытаюсь научиться использовать observeEvent и actionButton. Тем не менее, я хотел бы иметь возможность выбрать столбцы, которые я использую, поэтому я наткнулся на pickerInput. Короче говоря, я хотел бы иметь возможность выбрать набор столбцов из RLdata10000 и применить функцию через actionButton.

Моя проблема в том, что я получаю ошибку: Error: unused argument (RLdata10000). Мой код ниже. Я хотел бы иметь возможность сделать это с двумя файлами данных в конце концов. Любая помощь будет оценена.

library(shiny)
library(DT)
library(shinyWidgets)
library(plyr)
library(dplyr)
library(RecordLinkage)

data(RLdata10000)

cleanup <- function(x){
  x <- as.character(x) # convert to character
  x <- tolower(x) # make all lowercase
  x <- trimws(x, "both") # trim white space
  return(x)
}

ui <- basicPage(
  h2("Record Linkage Data"),
  actionButton(inputId = "clean", label = "Clean Data")
  pickerInput(width = "75%",
  inputId = "pick_col1",
  label = "Select columns to display",
  choices = colnames(RLdata10000),
  selected = colnames(RLdata10000),
  options = list(
    `actions-box` = T,
    `selected-text-format` = paste("count > ", length(colnames(RLdata10000)) - 1),
  `count-selected-text` = "Alle",
  liveSearch = T,
  liveSearchPlaceholder = T
),

multiple = T)
  DT::dataTableOutput("mytable")
)

server <- function(input, output) {
  observeEvent(input$clean, {
  output$mytable = DT::renderDataTable({
    lapply(input$pick_col1, cleanup)
  })
 }
}
shinyApp(ui, server)

1 Ответ

2 голосов
/ 17 января 2020

Я на самом деле не смог воспроизвести ошибку, которую вы отметили, но у вас было несколько проблем, которые мешали вам получить то, что (я думаю) вы ищете.

Первый вы пропустили запятые в пользовательском интерфейсе после элементов actionButton и pickerInput.

Второй , вы даете lapply имена столбцов, а не данные - когда вы используете input$pick_col1, ваша функция очистки не имеет над чем работать. Использование select из dplyr обеспечивает простой способ присвоения имен столбцам и получения данных.

Last , renderDataTable хочет использовать формат таблицы в качестве входных данных (т. Е. Либо фрейм данных или матрица), но lapply создает список. Вам необходимо преобразовать вывод lapply в работающий класс.

Из этих трех изменений обновленный код будет выглядеть следующим образом:

library(shiny)
library(DT)
library(shinyWidgets)
library(plyr)
library(dplyr)
library(RecordLinkage)

data(RLdata10000)

cleanup <- function(x){
  x <- as.character(x) # convert to character
  x <- tolower(x) # make all lowercase
  x <- trimws(x, "both") # trim white space
  return(x)
}

ui <- basicPage(
  h2("Record Linkage Data"),
  actionButton(inputId = "clean", label = "Clean Data"),
  pickerInput(width = "75%",
              inputId = "pick_col1",
              label = "Select columns to display",
              choices = colnames(RLdata10000),
              selected = colnames(RLdata10000),
              options = list(
                `actions-box` = T,
                `selected-text-format` = paste("count > ", length(colnames(RLdata10000)) - 1),
                `count-selected-text` = "Alle",
                liveSearch = T,
                liveSearchPlaceholder = T
              ),

              multiple = T),
  DT::dataTableOutput("mytable")
)

server <- function(input, output) {
  observeEvent(input$clean, {
    output$mytable = DT::renderDataTable({
      data.frame(lapply(select(RLdata10000, input$pick_col1), cleanup))
    })
  })
}

shinyApp(ui, server)
...