R语言 有没有一种方法可以让我的应用程序接受用户传递的参数?

6tqwzwtp  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个R shiny应用程序,我在R studio中编写了独立的ui.R,server.R,global.R和一个www文件夹,其中有一些图片。该应用程序所做的是显示其全局.R文件中指定的目录中的图像。图像具有允许用户选择图像的复选框。一旦用户选择他们的图片并按下称为“创建”的操作按钮,应用程序将创建2个文本文件,列出应用程序目录中用户选择和未选择的图像的文件名。
现在,我真正需要帮助的是两件事:
1.我不想在全局.R文件中指定images目录和项目名称,我想让我的应用程序接受来自用户的参数,也就是说,我想让用户在运行应用程序时以某种方式指定images目录和项目名称(稍后在创建文本文件时使用的名称)。理想情况下,我想让我的global.R文件为空,其中没有代码。这可能吗?我的一个朋友建议我可以使用一个叫做ShinyOptions和getShinyOtion的东西,但我和他都不熟悉这个。
1.如果我要从我的计算机的命令行(终端)(而不是Rstudio中的终端)运行应用程序,我需要做什么?
所以,如果任何人有一个想法使用这些或其他人将非常感谢他们的帮助。
为了帮助重现我的案例,下面我包括了我目前在ui.R、server.R和global. R中的代码。
UI

library(shiny)
library(shinydashboard)

dashboardPage(
  dashboardHeader(title = "Pictures List"),
  dashboardSidebar(
    actionButton("the_action_button", "Create", width = "100%")
  ),
  dashboardBody(
    fluidRow(
      box(
        title = "Picture Selection",
        width = 12,
        uiOutput("image_selection")
      )
    )
  )
)

服务器

library(shiny)
library(shinydashboard)

function(input, output, session) {
  
  # Get a list of available image files from the specified folder
  
  image_files <- list.files(image_folder, pattern = "\\.png$", full.names = FALSE)
  
  # Initialize a list to store selected images
  selected_images <- reactiveVal(character(0))
  
  # Render UI for image selection
  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(img_tag, checkbox_tag)
      })
    )
  })
  
  # Create and download text files based on selected images
  observeEvent(input$the_action_button, {
    # Create a timestamp for the filenames
    timestamp <- format(Sys.time(), format = "%Y%m%d")
    
    # Create text file for images not selected
    not_selected_images <- setdiff(image_files, selected_images())
    not_selected_filename <- paste0("not_selected_file_", project_name,
                                    "_", timestamp, ".txt")
    writeLines(not_selected_images, con = not_selected_filename)
    
    # Create text file for selected images
    selected_images <- selected_images()
    selected_filename <- paste0("selected_file_list_", project_name, 
                                "_", timestamp, ".txt")
    writeLines(selected_images, con = selected_filename)
  })
}

全球

image_folder <- "~/Desktop/pictures_folder"
project_name <- "land_project"
oyt4ldly

oyt4ldly1#

因此,这实际上是Saving R Shiny app as a function with arguments passed to the shiny app的副本,您使用shinyOptions是正确的,但现在我已经弄清楚了:
你需要用一个调用shiny::runApp的函数来启动这个应用程序(为了找到服务器和用户界面,你传递这个函数有很多选项)。

run_app <- function(image_folder,project_name){
shinyOptions(image_folder = image_folder)
shinyOptions(project_name = project_name)
shiny::runApp("<location of ui.R and server.R>")
}

然后在服务器中添加这个(我只在main函数之外尝试过,但如果它在内部也没关系):

image_folder <- getShinyOption("image_folder", image_folder.default)
project_name <- getShinyOption("project_name", project_name.default)

然后启动应用程序用途:

run_app("~/Desktop/pictures_folder","land_project")
busg9geu

busg9geu2#

使用Shiny的textInput和fileInput小部件,允许用户在运行应用程序时指定图像目录和项目名称:

library(shiny)

库(shinydashboard)
Jmeter 板页面(dashboardHeader(title =“图片列表”),dashboardSidebar(textInput(“image_directory”,“Image Directory”,placeholder =“Enter directory path”),textInput(“project_name”,“项目名称”,placeholder =“输入项目名称”),actionButton(“the_action_button”,“Create”,width =“100%”)),dashboardBody(fluidRow(box(title =“Picture Selection”,width = 12,uiOutput(“image_selection”)

更新server.R以使用这些输入:

library(shiny)
library(shinydashboard)

function(input, output, session) {
  observe({
    # Get the image folder and project name from user inputs
    image_folder <- input$image_directory
    project_name <- input$project_name
    
    # Get a list of available image files from the specified folder
    image_files <- list.files(image_folder, pattern = "\\.png$", full.names = FALSE)
    
    # ... rest of your server logic ...
  })

  # ... rest of your server logic ...
}

相关问题