2017-01-12 1 views
0

Входы отображаются в формате «iris $ Petal.Width - iris $ Species». На выбранные входы, данные для разделения и диафрагмы $ Petal.Width только для фильтрации всего данные. Пример: выбранные значения такие же, как на изображении. userIputблестящий с использованием selectizeInput для построения динамических выходных данных

Попытка получить данные, такие как dplyr :: фильтра (радужной оболочки глаза, радужной оболочки $ Petal.Width% в% с ('0,2', '0.3', '0,1', '0,6', '1.4')) Как для формирования c ('0,2', '0,3', '0,1', '0,6', '1,4') динамически.

Взял этот пример для удобного понимания, на самом деле входы находятся в A001 - Description1, A002 - формате Description2. Необходимо принять A001, A002 для формирования c ('A001', 'A002').

Пробовал с ниже код:

## run in interactive R sessions 
if (interactive()) { 

    ui <- fluidPage(

    selectizeInput('ipdesc', label='Selector', 
        choices = as.list(c(unique(paste(iris$Petal.Width,iris$Species,sep = " - ")))), 
        multiple = TRUE, 
        options = list(maxItems = 5) 
    ), 
    p("Select Codes (Max 5), then press 'Go'"), 
    actionButton("go", label = "Go"), 
    tableOutput("selected") 
) 

    server <- function(input, output) { 
    # 
    output$selected <- renderTable({ 
     filterdata() 
    }) 

    filterdata <- eventReactive(input$go,{ 
     x=c() 
     cnt = length(input$ipdesc) 
     for (i in 1:cnt){ 
     if (i != cnt) { 
      x[i] = cat(sapply(strsplit(input$ipdesc[i], " - "), "[", 1),",") 
     } 
     else 
     {x[i] = cat(x[1],sapply(strsplit(input$ipdesc[i], " - "), "[", 1))} 

     } }) 


    # 

    } 

    shinyApp(ui, server) 

} 

ответ

0

Это на самом деле не shinyapps или shinyjs вопрос, все, что вам нужно знать, как матч разбить строку, чтобы соответствовать ее части в кадре данных. Поскольку вы работаете с кадрами данных, strsplit() может быть не самым элегантным решением.

Как вы упоминаете dplyr, я дам вам tidyverse вариант:

Попробуйте использовать separate() из tidyr пакета. convert = TRUE означает, что полученные столбцы должны быть автоматически преобразованы в числовое/целое/логическое, если это возможно.

library(dplyr) 
library(tidyr) 

input <- "1.8 - versicolor" 

temp <- data.frame(input = input) %>% 
      tidyr::separate(input, c("Petal.Width", "Species"), 
          sep = " - ", convert = TRUE) 
filtered <- dplyr::filter(iris, iris$Petal.Width %in% temp$Petal.Width) 

filtered выход:

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.9   3.2   4.8   1.8 versicolor 
# 2   6.3   2.9   5.6   1.8 virginica 
# 3   7.3   2.9   6.3   1.8 virginica 
# 4   6.7   2.5   5.8   1.8 virginica 
# 5   6.5   3.0   5.5   1.8 virginica 
# ... 

Обратите внимание, что это соответствует как versicolor и virginica.

В сочетании с блестящим сценарием:

library(shiny) 
if (interactive()) { 

    ui <- fluidPage(
    selectizeInput('ipdesc', label='Selector', 
        choices = as.list(c(unique(paste(iris$Petal.Width,iris$Species,sep = " - ")))), 
        multiple = TRUE, 
        options = list(maxItems = 5) 
    ), 
    p("Select Codes (Max 5), then press 'Go'"), 
    actionButton("go", label = "Go"), 
    tableOutput("selected") 
) 

    server <- function(input, output) { 

    output$selected <- renderTable({ 
     filterdata() 
    }) 

    filterdata <- eventReactive(input$go, { 
     temp <- data.frame(input = input$ipdesc) %>% 
     tidyr::separate(input, c("Petal.Width", "Species"), sep = " - ", convert = TRUE) 

     iris %>% 
     dplyr::filter(iris$Petal.Width %in% temp$Petal.Width) 

    })  
    } 

    shinyApp(ui, server) 

} 
+0

Спасибо Штеффи LaZerte, ваш подход очень близок к решению моей проблемы. Входы находятся в формате «A00 - Описание». Следовательно, когда я запускаю, он дает сообщение об ошибке как «Ошибка: операции возможны только для числовых, логических или сложных типов». Любое предложение пожалуйста. – SPS

+0

Вы хотите опустить аргумент 'convert = TRUE'. Этот аргумент указывает 'separate()' преобразовать результат в числовой (в приведенном выше случае). Но в вашем случае вы получите «A00» и «Описание», ни один из которых не является числовым (ни логичным, ни сложным), и я подозреваю, почему вы получаете эту ошибку. –

Смежные вопросы