Как сделать программу 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 )