You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny中renderPlot返回仅含坐标轴的空白绘图问题排查

Troubleshooting Your Blank Shiny Power Plot

Hey there! Let's figure out why your plot is showing up empty—you’re right to suspect the samplesize1 and powervector1 vectors are the culprit. Here are the most common issues and fixes to get your power curve displaying properly:

1. Fix Vector Initialization (The #1 Cause of Empty Vectors)

A lot of times, blank plots happen because the vectors aren’t properly initialized before the for loop runs. If you’re just assigning values to samplesize1[i] and powervector1[i] without first creating empty vectors, R won’t store the values correctly (especially if your loop starts at n/2 instead of 1).

Bad Example (Common Mistake):

observe({
  n <- input$n
  # No initialization of samplesize1/powervector1 here!
  for (i in seq(n/2, 2*n)) {
    samplesize1[i] <- i
    powervector1[i] <- pwr.t.test(n = i, d = 0.5)$power # Example test
  }
})

Fixed Initialization:

Initialize your vectors with the right length first, or use a counter to fill them sequentially:

observe({
  n <- input$n
  sample_seq <- seq(n/2, 2*n, by = 1) # Define your sequence upfront
  samplesize1 <- numeric(length(sample_seq)) # Empty vector matching sequence length
  powervector1 <- numeric(length(sample_seq))
  
  for (idx in 1:length(sample_seq)) {
    current_n <- sample_seq[idx]
    samplesize1[idx] <- current_n
    powervector1[idx] <- pwr.t.test(n = current_n, d = input$effect_size)$power
  }
})

2. Ditch the For Loop (Use Vectorized Code for Reliability)

Shiny works better with vectorized operations instead of for loops—they’re faster, easier to debug, and less prone to indexing errors. Here’s a cleaner way to generate your power data:

server <- function(input, output) {
  # Generate power data reactively
  power_results <- reactive({
    req(input$n) # Wait until input$n is available
    n <- input$n
    
    # Create your sample size sequence (round to integers if needed!)
    samplesize1 <- seq(from = ceiling(n/2), to = 2*n, by = 1)
    
    # Calculate power for each sample size (replace with your test function)
    powervector1 <- sapply(samplesize1, function(x) {
      pwr.t.test(
        n = x,
        d = input$effect_size, # Add your input parameters here
        sig.level = 0.05,
        type = "two.sample"
      )$power
    })
    
    # Return a data frame for easy plotting
    data.frame(Sample_Size = samplesize1, Power = powervector1)
  })
  
  # Render the plot
  output$power_plot <- renderPlot({
    req(power_results()) # Ensure data exists before plotting
    ggplot(power_results(), aes(x = Sample_Size, y = Power)) +
      geom_point(color = "#2c3e50") +
      geom_line(color = "#3498db") +
      labs(x = "样本量", y = "检验效能") +
      theme_bw()
  })
}

3. Debug to Confirm Your Vectors Have Data

If you’re still stuck, add a debug output to check what’s in your vectors:

# Add this to your server
output$debug_output <- renderPrint({
  str(power_results()) # Show structure of your data
})

# Add this to your UI
verbatimTextOutput("debug_output")

This will tell you if samplesize1 and powervector1 are empty, have NA values, or contain unexpected data (like non-integer sample sizes, which can break power calculations).

4. Check for Hidden Issues

  • Integer Sample Sizes: If n is odd, n/2 will be a decimal. Most power functions require integer sample sizes, so use ceiling(n/2) to start at the next whole number.
  • Valid Power Calculations: Double-check that your power function (like pwr.t.test) has all required parameters—missing values can return NA, which won’t plot.

内容的提问来源于stack exchange,提问作者Shirley Huang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:20:56