0Pricing
R Academy · Ders

renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü

Kullanıcı girdisine ve sunucu durumuna göre kullanıcı arayüzü öğelerini anında oluşturun.

renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

Dinamik Kullanıcı Arayüzü — Neden ve Ne Zaman?

Bazen ihtiyaç duyduğunuz kullanıcı arayüzü uygulama başlatılırken tamamen belirlenemez; kullanıcı seçimlerine, yüklenen verilere veya çalışma zamanı koşullarına bağlıdır. Shiny iki mekanizma sunar: renderUI() bir yer tutucunun tüm içeriğini değiştirir; insertUI()/removeUI() ise her şeyi değiştirmeden öğe ekler veya kaldırır.

library(shiny)

# Static UI: columns always shown
# ui <- fluidPage(selectInput('x', ...), selectInput('y', ...))

# Dynamic UI: columns depend on which dataset was loaded
# ui <- fluidPage(fileInput('upload', ...), uiOutput('var_selectors'))

renderUI() ve uiOutput()

Sunucudaki renderUI({...}), bir kullanıcı arayüzü öğesini reaktif olarak oluşturur ve döndürür. Kullanıcı arayüzündeki uiOutput('id'), renderUI tarafından üretilen içeriği görüntüleyen bir yer tutucu oluşturur. Reaktif işlem her yeniden çalıştığında yer tutucunun tüm içeriği değiştirilir.

ui <- fluidPage(
  selectInput('dataset', 'Dataset:', choices = c('iris', 'mtcars')),
  uiOutput('column_selector')   # placeholder
)

server <- function(input, output, session) {
  output$column_selector <- renderUI({
    df <- get(input$dataset)  # reactive dependency on dataset
    selectInput('col', 'Choose Column:',
                choices = names(df))
  })
}

shinyApp(ui, server)

Birden Çok Denetimle renderUI()

Aynı anda birden çok kullanıcı arayüzü öğesi oluşturmak için renderUI() içinden bir tagList() döndürün. Denetimlerin sayısının verilere bağlı olduğu durumlarda bu, standart örüntüdür; örneğin bir veri kümesindeki her sütun için bir filtre oluşturmak gibi.

server <- function(input, output, session) {
  output$filters <- renderUI({
    df    <- get(input$dataset)
    nums  <- names(df)[sapply(df, is.numeric)]

    # One slider per numeric column
    sliders <- lapply(nums, function(col) {
      rng <- range(df[[col]], na.rm = TRUE)
      sliderInput(
        inputId = paste0('filter_', col),
        label   = col,
        min     = rng[1], max = rng[2],
        value   = rng
      )
    })
    tagList(sliders)   # render all sliders
  })
}

insertUI() — Öğeleri Dinamik Olarak Ekleme

insertUI(selector, where, ui), sayfanın tamamını yeniden oluşturmadan bir kullanıcı arayüzü öğesini DOM içine ekler. Ekleme noktasını hedeflemek için CSS seçicilerini kullanın. where değeri 'afterEnd', 'beforeEnd', 'afterBegin' veya 'beforeBegin' olabilir.

server <- function(input, output, session) {
  item_count <- reactiveVal(0)

  observeEvent(input$add_item, {
    item_count(item_count() + 1)
    id <- paste0('item_', item_count())

    insertUI(
      selector = '#item_container',  # CSS selector
      where    = 'beforeEnd',
      ui       = div(
        id    = id,
        style = 'padding: 5px; border: 1px solid #ccc; margin: 3px;',
        textInput(id, paste('Item', item_count()), value = '')
      )
    )
  })
}

removeUI() — Öğeleri Silme

removeUI(selector), CSS seçicisiyle eşleşen ilk DOM öğesini kaldırır. Eşleşen tüm öğeleri kaldırmak için multiple = TRUE kullanın. Bu, kullanıcıların öğe ekleyip kaldırabildiği liste tabanlı kullanıcı arayüzlerinde insertUI() işlevinin tamamlayıcısıdır.

server <- function(input, output, session) {
  observeEvent(input$remove_last, {
    # Remove the last item div
    n <- isolate(item_count())
    if (n > 0) {
      removeUI(selector = paste0('#item_', n))
      item_count(n - 1)
    }
  })

  observeEvent(input$clear_all, {
    # Remove all items matching a class
    removeUI(selector = '.dynamic-item', multiple = TRUE)
    item_count(0)
  })
}

conditionalPanel() — İstemci Taraflı Görünürlük

conditionalPanel(condition, ...), tarayıcıda değerlendirilen bir JavaScript koşuluna göre kullanıcı arayüzü öğelerini gösterir veya gizler. renderUI() işlevinden farklı olarak öğeler her zaman DOM içindedir; yalnızca görünür veya gizli durumdadır. Sunucuya gidip gelme gerekmediğinden basit gösterme/gizleme mantığı için daha hızlıdır.

ui <- fluidPage(
  selectInput('plot_type', 'Plot Type:',
              choices = c('scatter', 'histogram', 'boxplot')),

  # Only shown when scatter is selected
  conditionalPanel(
    condition = "input.plot_type == 'scatter'",
    selectInput('x_var', 'X Variable:', choices = names(mtcars)),
    selectInput('y_var', 'Y Variable:', choices = names(mtcars))
  ),

  # Only shown when histogram is selected
  conditionalPanel(
    condition = "input.plot_type == 'histogram'",
    sliderInput('bins', 'Number of bins:', 5, 50, 20)
  ),

  plotOutput('main_plot')
)

updateSelectInput() — Mevcut Girdileri Değiştirme

Bir girdinin tamamını değiştirmek yerine, mevcut bir selectInput'ın yalnızca seçeneklerini veya seçili değerini güncellemek için updateSelectInput(session, id, choices, selected) kullanın. Tüm girdi türleri için benzer güncelleme işlevleri vardır: updateSliderInput(), updateTextInput() vb.

server <- function(input, output, session) {
  # When dataset changes, update the column selector
  observeEvent(input$dataset, {
    df <- get(input$dataset)
    updateSelectInput(
      session  = session,
      inputId  = 'column',
      choices  = names(df),
      selected = names(df)[1]
    )
  })

  # Reset slider when reset button pressed
  observeEvent(input$reset_btn, {
    updateSliderInput(session, 'n_items',
                     value = 20, min = 1, max = 100)
  })
}

updateSliderInput() ve updateNumericInput()

Güncelleme işlevleri, mevcut bir girdinin geçerli değerini, minimumunu, maksimumunu veya etiketini değiştirmek üzere tarayıcıya bir ileti gönderir. Bu, denetimi renderUI() ile yok edip yeniden oluşturmaktan daha verimlidir ve denetimin sayfa düzenindeki konumunu korur.

server <- function(input, output, session) {
  # When data loads, set slider max to actual data length
  observeEvent(input$load_data, {
    data <- readRDS(input$upload$datapath)

    updateSliderInput(session, 'row_slider',
      min   = 1,
      max   = nrow(data),
      value = c(1, min(50, nrow(data)))
    )

    updateNumericInput(session, 'page_size',
      max   = nrow(data),
      value = min(10, nrow(data))
    )
  })
}

renderUI Girdilerine req() ile Erişme

renderUI() ile dinamik olarak oluşturulan girdiler, oluşturulana kadar NULL değerindedir. Dinamik olarak oluşturulan girdilere bağlı tüm sunucu kodlarında başlangıç sırasında oluşabilecek hataları önlemek için req(input$dynamic_input) kullanın.

server <- function(input, output, session) {
  # dynamic input: 'col' is created by renderUI
  output$column_selector <- renderUI({
    selectInput('col', 'Column:', choices = names(get(input$dataset)))
  })

  output$summary_stats <- renderPrint({
    req(input$col)           # wait until 'col' exists
    req(input$dataset)       # and dataset is chosen
    df <- get(input$dataset)
    summary(df[[input$col]])
  })
}

appendTab() ile Dinamik Sekmeler

appendTab(inputId, tab, select), çalışma zamanında bir tabsetPanel() öğesine yeni bir sekme ekler. removeTab(inputId, target) ise bir sekmeyi kaldırır. Bu örüntü, kullanıcıların dinamik olarak oluşturulan analiz görünümleri arasında açma, kapatma ve geçiş yapabildiği iş akışlarını mümkün kılar.

ui <- fluidPage(
  actionButton('add_tab', 'Open New Analysis Tab'),
  tabsetPanel(id = 'analysis_tabs', type = 'tabs')
)

server <- function(input, output, session) {
  tab_count <- reactiveVal(0)

  observeEvent(input$add_tab, {
    tab_count(tab_count() + 1)
    n <- tab_count()
    appendTab(
      inputId = 'analysis_tabs',
      select  = TRUE,
      tab = tabPanel(
        title = paste('Analysis', n),
        value = paste0('tab_', n),
        plotOutput(paste0('plot_', n)),
        actionButton(paste0('close_', n), 'Close')
      )
    )
  })
}

renderUI ve insertUI — Hangisi Ne Zaman Kullanılmalı?

Kullanım amacınıza göre doğru aracı seçin:

  • renderUI(): Bir yer tutucunun tüm içeriğini reaktif olarak değiştirir. Tüm blok birlikte değiştiğinde en uygunudur.
  • insertUI(): Mevcut içeriğe yeni öğeler ekler. Her şeyi yeniden oluşturmak istemediğiniz büyüyen listeler için en uygunudur.
  • updateXxxInput(): Mevcut bir girdiyi yerinde değiştirir. Yeniden oluşturmadan seçenekleri veya değerleri değiştirmek için en uygunudur.
  • conditionalPanel(): Sunucuya gidip gelmeden gösterir veya gizler. Basit görünürlük mantığı için en uygunudur.
# Decision guide:
# - 'Show filter only when advanced mode' -> conditionalPanel
# - 'Populate column choices from loaded CSV' -> updateSelectInput
# - 'Show different controls per selected tab' -> renderUI
# - 'Add a row editor for each row user adds' -> insertUI
# - 'Remove a row editor' -> removeUI

# Combining strategies:
server <- function(input, output, session) {
  # Use renderUI for column selectors (replaces whole block)
  output$col_selectors <- renderUI({ ... })
  # Use insertUI for dynamically added rows
  observeEvent(input$add_row, { insertUI(...) })
  # Use conditionalPanel for show/hide (in UI, no server code)
}

Kısa Kontrol

Shiny'de dinamik kullanıcı arayüzü oluştururken renderUI() ile insertUI() arasındaki temel fark nedir?

Dinamik Kullanıcı Arayüzünün Özeti

renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü bölümünden temel çıkarımlar:

  • renderUI({}) + uiOutput('id'): bir yer tutucunun tüm içeriğini reaktif olarak değiştirir.
  • Aynı anda birden çok öğe oluşturmak için renderUI() içinden tagList() döndürün.
  • insertUI(selector, where, ui): öğeleri herhangi bir DOM konumuna ekler.
  • removeUI(selector): öğeleri CSS seçicisine göre kaldırır.
  • conditionalPanel(condition, ...): sunucu kullanmadan istemci tarafında gösterir veya gizler.
  • updateSelectInput(), updateSliderInput(): mevcut girdileri yerinde değiştirir.
  • Dinamik girdiler oluşturulmadan önce NULL değerine karşı koruma sağlamak için her zaman req(input$dynamic_id) kullanın.
# Typical pattern: dynamic column selector
ui <- fluidPage(
  fileInput('upload', 'Upload CSV'),
  uiOutput('col_ui'),          # placeholder
  plotOutput('col_plot')
)

server <- function(input, output, session) {
  df <- reactive({
    req(input$upload)
    read.csv(input$upload$datapath)
  })

  output$col_ui <- renderUI({
    req(df())
    selectInput('col', 'Column:', choices = names(df()))
  })

  output$col_plot <- renderPlot({
    req(input$col)
    hist(df()[[input$col]])
  })
}

Sıkça Sorulan Sorular

“renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü” dersi ücretsiz mi?

Evet — “renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü” dersinde ne öğreneceğim?

Kullanıcı girdisine ve sunucu durumuna göre kullanıcı arayüzü öğelerini anında oluşturun. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tepkisel Programlamaya Derinlemesine Bakış
  2. Kod Yeniden Kullanımı için Shiny Modülleri
  3. renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü
  4. Shiny Uygulamalarını Dağıtma
← R Academy Sayfasına Dön