использование переключателя в реактивном () блестящем, и избегая повторного обновления объекта - PullRequest
0 голосов
/ 24 апреля 2020

Я довольно новичок в блестящем и реактивном программировании и не могу понять, как делать то, что я хочу. У меня есть простое приложение, которое читает изображение из файла и выполняет некоторые преобразования. Затем он строит оригинал против преобразованного изображения. Я использовал tabsetPanel () для изменения ползунков, которые пользователь может изменять в зависимости от того, какое преобразование он выберет. Преобразования работают хорошо. Но мне бы хотелось, чтобы состояние исправленного изображения оставалось от предыдущего преобразования, а не от исходного изображения каждый раз, когда мы меняем входное преобразование.

Спасибо за вашу помощь

Вот код приложения:

library(magick)

parameter_tabs <- tagList(
    tags$style("#transform { display:none; }"),
    tabsetPanel(id = "transform",
        tabPanel("deskew",
            sliderInput("threshold", "Threshold", min = 1, max = 1000, value = 200, step = 10)
            ),
        tabPanel("resize",
            numericInput("geometry", "% of resizing", value = 20, min = 1 , max = 100, step = 1)
            ),
        tabPanel("trim",
            numericInput("fuzz", "Color distance as equal", value = 40, min = 0, max = 100, step = 1)
            ),
        tabPanel("modulate",
            sliderInput("brightness", "Brightness", min = 0, max = 100, value = 100, step = 10),
            sliderInput("saturation", "Saturation", min = 0, max = 100, value = 100, step = 10),
            sliderInput("hue", "Hue", min = 0, max = 200, value = 100, step = 10)
            ),
        tabPanel("reducenoise",
            sliderInput("radius", "radius in pixel", min = 1, max = 1000, value = 1, step = 10),
            ),
        tabPanel("contrast",
            sliderInput("sharpen", "sharpen", min = 1, max = 100, value = 30, step = 10),
            ),
        tabPanel("convolve",
            selectInput("kernel", "kernel", selected = "Gaussian", choices = kernel_types()[2:38]),
            numericInput("iteration", "iteration", value = 100, max = 10000) 
            ),
        tabPanel("convertGrayscale",
            checkboxInput("convertGrayscale", "Convert to Grayscale?", value = TRUE),
            ),
        tabPanel("rotate",
            sliderInput("degrees", "Angle for rotation", value = 0, min = -180, max = 180, step = 1),
        )
    )
)

# Define UI for application that draws a histogram
ui <- fluidPage(

        # Application title
        fileInput("file_image","Upload an jpg to do OCR",accept = "jpg"),

        fluidRow(
            sidebarPanel(
                selectInput("transform_image", "Image transformation", 
                    choices = c("deskew", "resize", "trim", "modulate", "reducenoise", "contrast", "convolve", "convertGrayscale", "rotate")),
                parameter_tabs
            ),    
            column(4,
                plotOutput("image_plot", width = "100%", height = "400px")
            ),
            column(4,
                plotOutput("corrected_image_plot", width = "100%", height = "400px")
            )
        )
)

# Define server logic required to draw a histogram
server <- function(input, output, session) {
    observeEvent(input$transform_image, {
        updateTabsetPanel(session, "transform", selected = input$transform_image) 
    })
    correct_image <- reactive({ 
        switch(input$transform_image,
            deskew =  image_deskew(read_image(), threshold = input$threshold),
            resize =  image_resize(read_image(), geometry = input$geometry),
            trim =  image_trim(read_image(), fuzz = input$fuzz),
            modulate =  image_modulate(read_image(), brightness = input$brightness, saturation = input$saturation, hue = input$hue),
            reducenoise =  image_reducenoise(read_image(), radius = input$radius),
            contrast =  image_contrast(read_image(), sharpen = input$sharpen),
            convolve =  image_convolve(read_image(), kernel = input$kernel, iterations = 1),
            convertGrayscale =  image_convert(read_image(), type = 'Grayscale'),
            rotate =  image_rotate(read_image(), degrees = input$degrees)
            )
    }
    )

    read_image <- reactive({
        req(input$file_image)
        image_read(input$file_image$datapath)
    })


    output$image_plot <- renderPlot({
            plot(read_image())
    })
    output$corrected_image_plot <- renderPlot({
            plot(correct_image())
    })
}

# Run the application 
shinyApp(ui = ui, server = server)```

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...