Как сделать программу R (с Shiny) более модульной

Весь код R на GitHub

У меня есть R код, который позволяет человеку рисовать палитру, т.е.

PaintPalette("GoldenTemple","GoldenTemple2") 

Звонки общедоступные PaintPalette который затем вызывает внутреннюю RenderPalette построить это

Тем не менее, у меня есть блестящая функция, которая позволяет пользователю CherryPick свою собственную палитру

CherryPickPalette("GoldenTemple","GoldenTemple2")

запустит Shiny ....

но код для рендеринга палитры дублируется внутри блестящего кода...... как упростить это?

CustomPal <- function(new_pal){

    #snip
    cherrypickedpalette <- runApp(list(
      ui = fluidPage(
        #snip
      ),
      server = function(input,output,session){
        outputdata <-  reactive({
          input$col
        })


        #snip

        output$cherrycolors=renderPlot({
          if (!is.null(input$col))
          {
            n <- length(input$col)
            old <- graphics::par(mar = c(0.5, 0.5, 0.5, 0.5))
            on.exit(graphics::par(old))
            graphics::image(1:n, 1, as.matrix(1:n), col = input$col,
                          ylab = "", xaxt = "n", yaxt = "n", bty = "n")
            graphics::rect(0, 0.9, n + 1, 1.1, col = grDevices::rgb(1, 1, 1, 0.8), border = NA)
            graphics::text((n + 1) / 2, 1, labels = "Cherry-Picked Palette", cex = 2, family = "serif")}
        }, height = 450, width = 450 ) 


       #snip
      }#end server
    )#end list
    )#end runApp
  }#end if interactive
}

1 ответ

Решение

Кажется, ты должен просто позвонить RenderPalette() функционировать внутри вашего renderPlot() устранить дублирование

 output$cherrycolors=renderPlot({
        if (!is.null(input$col)) {
            RenderPalette(input$col, "Cherry-Picked Palette")
        }}, height = 450, width = 450 ) 
Другие вопросы по тегам