Предложения по улучшению кода R-Shiny (Должен ли я выполнить код дважды, чтобы отобразить различные результаты в R-Shiny?) - PullRequest
0 голосов
/ 17 февраля 2019

Я довольно новичок в R-Shiny и пытаюсь использовать код, написанный на R с R-Shiny.Поскольку код был впервые написан на R, я столкнулся с трудностями с синтаксисом, который будет использоваться в R-Shiny.

Я хочу знать, есть ли более эффективный способ, при котором мне не нужно переписывать весь код заново для отображения различных результатов.

Например, формат моего R-Shiny выглядит следующим образом:

ui <- fluidPage(


#my input Buttons/sliders( ),

#output functions (I am using 3 outputs)

plotOutput("Hindcast"),
plotOutput("Histogram"),
plotOutput("Pval")

)

server<-function(input,output) {

output$Hindcast<-renderPlot({

#Here I write my code

plot(#required output for "Hindcast")

})

output$Histogram <- renderPlot({

#Here I am required to write most of the code again
#I tried using the reactive function, but the way my code is built, it would 
require too many reactive functions

plot...
})
output$Pval <- renderPlot({

#entire code again

plot...
}) 
shinyApp(ui=ui, server)

Я бы загрузил свой код здесь, но он слишком длинный, и проблема не в кодировании, а всинтаксис.

Помощь оценена.

1 Ответ

0 голосов
/ 18 февраля 2019

Трудно однозначно комментировать без реального кода, но здесь есть ссылка на некоторые хорошие ресурсы по реактивному программированию.

https://www.rstudio.com/resources/webinars/shiny-developer-conference/

Первые 2 видео - золотая жила.


Как правило, в вашем приложении никогда не должно быть повторяющегося кода.И я не понимаю, почему вам потребовалось бы несколько реактивных функций, когда ваше оригинальное приложение имеет повторяющийся код.

Первый шаг к планированию любого приложения - это иметь в виду (или на бумаге) наличие реактивных зависимостей, т.е.От чего inputs зависит мой outputs.

Во-вторых, рассмотрим вопрос «какой код является общим для всех графиков?».Поскольку существует несколько графиков, основное предположение состоит в том, что что-то должно измениться, чтобы создать разные графики.Мы берем весь код до этой точки и можем называть его «общим кодом».

Наконец, мы объединяем первые две точки, обеспечивая сохранение зависимостей без избыточного кода.

Здесьпростой пример с избыточным кодом.

Код избыточности

library(shiny)
library(dplyr)

data = mtcars

shinyApp(ui = {
  fluidPage(
    sliderInput("selectHP","Select Horse Power",min(data$hp),max(data$hp),data$hp),
    sliderInput("selectCyl","Select Cylinders",min(data$cyl),max(data$cyl),data$cyl),
    sliderInput("mpg","Select MPG Range",min(data$mpg),max(data$mpg),data$mpg),
    plotOutput("hp_mpg"),
    plotOutput("cyl_mpg")
  )
},
server = function(input,output){
  output$hp_mpg = renderPlot({

    #Shared Code
    data = data%>%
      filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
      filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
      filter(between(mpg,input$mpg[1],input$mpg[2]))

    plot(data$hp,data$mpg)
  })

  output$cyl_mpg = renderPlot({

    #Shared Code
    data = data%>%
      filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
      filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
      filter(between(mpg,input$mpg[1],input$mpg[2]))

    plot(data$hp,data$cyl)
  })
})

Удалена избыточность

library(shiny)
library(dplyr)

data = mtcars

shinyApp(ui = {
  fluidPage(
    sliderInput("selectHP","Select Horse Power",min(data$hp),max(data$hp),data$hp),
    sliderInput("selectCyl","Select Cylinders",min(data$cyl),max(data$cyl),data$cyl),
    sliderInput("mpg","Select MPG Range",min(data$mpg),max(data$mpg),data$mpg),
    plotOutput("hp_mpg"),
    plotOutput("cyl_mpg")
  )
},
server = function(input,output){


  data_reactive = reactive({
    data = data%>%
      filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
      filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
      filter(between(mpg,input$mpg[1],input$mpg[2]))

    return(data)
  })

  output$hp_mpg = renderPlot({

    plot(data_reactive()$hp,data_reactive()$mpg)
  })

  output$cyl_mpg = renderPlot({

    plot(data_reactive()$hp,data_reactive()$cyl)
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...