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

如何让R Shiny应用接收用户参数并从命令行启动?

解决方案

1. 使用ShinyOptions传递启动参数(移除global.R依赖)

完全可以通过shinyOptions()和getShinyOption()实现动态传参,具体步骤如下:

修改server.R

将原来依赖global.R的变量替换为从Shiny选项中读取,同时修复选中状态更新的逻辑(原代码缺少复选框状态监听):

library(shiny)
library(shinydashboard)

function(input, output, session) {
  # 从Shiny选项获取参数
  image_folder <- getShinyOption("image_folder")
  project_name <- getShinyOption("project_name")
  
  # 参数校验,确保启动时传入必要参数
  if (is.null(image_folder) || is.null(project_name)) {
    stop("启动应用必须指定image_folder和project_name参数")
  }
  
  # 获取指定目录下的PNG图片列表
  image_files <- list.files(image_folder, pattern = "\\.png$", full.names = FALSE)
  
  # 初始化响应式变量存储选中图片
  selected_images <- reactiveVal(character(0))
  
  # 监听所有复选框的状态变化,更新选中列表
  observe({
    checked_imgs <- names(input)[sapply(input, isTRUE)]
    selected_images(checked_imgs)
  })
  
  # 渲染图片选择UI
  output$image_selection <- renderUI({
    tagList(
      lapply(image_files, function(img) {
        img_tag <- tags$img(src = img, width = "100%")
        checkbox_tag <- checkboxInput(
          inputId = img,
          label = NULL,
          value = img %in% selected_images()
        )
        # 给每个图片块加样式,避免排版混乱
        div(style = "display: inline-block; width: 200px; margin: 10px;", img_tag, checkbox_tag)
      })
    )
  })
  
  # 点击Create按钮生成文件
  observeEvent(input$the_action_button, {
    timestamp <- format(Sys.time(), "%Y%m%d")
    
    # 生成未选中图片文件
    not_selected <- setdiff(image_files, selected_images())
    writeLines(
      not_selected,
      con = paste0("not_selected_file_", project_name, "_", timestamp, ".txt")
    )
    
    # 生成选中图片文件
    writeLines(
      selected_images(),
      con = paste0("selected_file_list_", project_name, "_", timestamp, ".txt")
    )
    
    showNotification("文件已成功生成", type = "success")
  })
}

创建启动脚本(start_app.R)

清空global.R,用单独的启动脚本传递参数:

library(shiny)

# 设置Shiny选项,替换为你的实际路径和项目名
shinyOptions(
  image_folder = "~/Desktop/pictures_folder",
  project_name = "land_project"
)

# 启动当前目录下的Shiny应用
shinyAppDir(".")

2. 从系统命令行启动应用

有两种实用方式:

方式1:执行启动脚本

  1. 确保已创建上述start_app.R
  2. 打开系统命令行(Windows用CMD/PowerShell,Mac/Linux用Terminal)
  3. 切换到应用所在目录:
    cd /path/to/your/shiny/app/directory
    
  4. 运行命令:
    Rscript start_app.R
    
    启动后,命令行会显示应用访问地址(如http://127.0.0.1:3838),复制到浏览器打开即可。

方式2:命令行直接传参

若需要动态指定参数,可创建支持命令行参数的启动脚本start_app_cli.R:

library(shiny)

# 读取命令行传入的参数
args <- commandArgs(trailingOnly = TRUE)
if (length(args) != 2) {
  stop("请按格式传入参数:Rscript start_app_cli.R [图片目录] [项目名]")
}

# 设置Shiny选项
shinyOptions(
  image_folder = args[1],
  project_name = args[2]
)

shinyAppDir(".")

然后在命令行执行:

cd /path/to/your/app
Rscript start_app_cli.R "~/Desktop/pictures_folder" "land_project"

前置要求

  • 系统已安装R,且Rscript命令可被识别(执行Rscript --version验证)
  • 已安装依赖包:install.packages(c("shiny", "shinydashboard"))

内容的提问来源于stack exchange,提问作者The Curious One

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:35:23