2016-03-16 3 views
1

Я чувствую, что этот вопрос относится к общему запросу о том, как манипулировать данными в контексте Shiny, но мой конкретный вопрос связан с использованием функций ввода/вывода в dplyr. Сейчас я столкнулся с двумя проблемами.Использование свинца/задержки в приложении Shiny

Первой проблемой является определение переменных в наборе данных, которые были lead/lag. Я использую подход dplyr, где я называю отстающую переменную yvar. CLearly это неверно, так как R не может найти yvar. Так может ли кто-нибудь рекомендовать способ изменить/создать переменную, чтобы результат был перенесен через блестящее приложение и доступно для вызова?

Вторая проблема заключается в указании количества строк для ввода/задержки переменной Y. В файле ui.R достаточно просто указать поле ввода с позициями ввода/вывода. Но как я могу поместить целое из этого поля ввода в качестве аргумента в функцию lead?

Вот ui.R:

library(shiny) 
library(ggplot2) 
library(dplyr) 


dataset <- iris 

shinyUI(pageWithSidebar(

    headerPanel("Iris Data Explorer"), 

    sidebarPanel(


    selectInput('x', 'X', names(dataset), names(dataset)[[2]]), 
    selectInput('y', 'Y', names(dataset), names(dataset)[[4]]), 
    selectInput('offset', 'Offset Level of Y', 0:5, 0), 
    selectInput('species', 'Species', levels(dataset$Species), "virginica") 
), 

    mainPanel(
    plotOutput('plot') 
) 
)) 

А вот server.R:

library(shiny) 
library(ggplot2) 
library(dplyr) 


shinyServer(function(input, output) { 

    dataset <- reactive({ 
    iris %>% 
     filter(Species==input$species) 
    #%>% mutate(yvar=lead(input$y, paste0(input$offset))) 
    }) 



    output$plot <- renderPlot({ 


    dataset<-dataset() 
    p <- ggplot(dataset, aes_string(x=input$x, 
            #y=yvar) 
            y=input$y 
    )) + 
     geom_point() 

    print(p) 

    }, height=500) 

}) 

ответ

3

Я думаю, что это то, что вы хотите. Для того, чтобы заставить его работать, я сделал следующее:

  • отказались mutate, потому что, видимо, довольно сложно использовать динамические имена с ним (см: R - dplyr - mutate - use dynamic variable names) и только что сделал это с индексацией кадра данных, как предложено здесь.
  • соединил его в один файл, так что я могу видеть все сразу (хорошо для мелочи)
  • добавлен в print о сваливать набор данных при каждом изменении, так что вы можете увидеть, что происходит.
  • добавил кавычки в переменную yvar так, что он работает с aesstring
  • добавил as.numeric переменное смещение в качестве вклада в lead

Это результирующий код:

library(shiny) 
library(ggplot2) 
library(dplyr) 

dataset <- iris 

u <- shinyUI(pageWithSidebar(
    headerPanel("Iris Data Explorer"), 
    sidebarPanel(
    selectInput('x', 'X', names(dataset), names(dataset)[[2]]), 
    selectInput('y', 'Y', names(dataset), names(dataset)[[4]]), 
    selectInput('offset', 'Offset Level of Y', 0:5, 0), 
    selectInput('species', 'Species', levels(dataset$Species), "virginica") 
), 
    mainPanel(
    plotOutput('plot') 
) 
)) 
s <- shinyServer(function(input, output) { 
    dataset <- reactive({ 
    df <- iris %>% filter(Species==input$species) 
    df[["yvar"]] <- lead(df[[input$y]],as.numeric(input$offset)) 
    return(df) 
    }) 
    output$plot <- renderPlot({ 
    dataset<-dataset() 
    print(dataset) 
    ggplot(dataset, aes_string(x=input$x,y="yvar")) + geom_point(na.rm=T) 
    }, height=500) 
}) 
shinyApp(ui=u,server=s) 

И это выглядит так: enter image description here

+0

Я думаю, что это верно. Вам придется протестировать его. –

+0

Фактически использование 'mutate' с динамическими именами тривиально - просто переключитесь на' mutate_' и предоставите именованный вектор с преобразованиями. –

+0

Тогда эта ссылка (что Хэдли была) устарела? Итак, как это должно выглядеть? Ваше описание слишком короткое для меня. –

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