【问题标题】:Shiny App - take user input into user defined function and download resulting filesShiny App - 将用户输入输入用户定义的函数并下载结果文件
【发布时间】:2019-08-20 15:39:22
【问题描述】:

我正在尝试构建我的第一个 Shiny 应用程序。

我有一个用户定义的函数,它需要生成加密密钥。我想把它做成一个闪亮的应用程序。

我尝试了如下。 UI 的第一部分的工作原理是它要求输入用户名的文本(这应该用于标记输出文件) - 我设法得到一个操作按钮,然后用户可以单击该按钮理论上运行代码制作加密密钥。

library(shiny)

# Define UI for ODK Encryption app ----

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

  # Application title
  titlePanel("Make ODK Encryption Keys"),

  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      textInput("name",
                  "Enter your name:"),
      actionButton(inputId = "input_action", label = "Generate Keys")

    ),

    mainPanel(

    )
  )
)

我觉得 mainPanel 中应该有一些东西可以为输出的密钥文件提供链接,或者它们可以自动下载?

然后在服务器部分 I 1) 以 sys-date-time 作为种子 2)取名称(如上面输入的)并将其链接到 sys-date 为最终键创建文件名 3)然后我定义我的功能(create.key.pair) - 这需要 sys-date-time(在上面的 1 中设置)并使用它和 openSSL 来生成公钥和私钥。它使用在第 2 点中输入的名称标记这些文件(应该从闪亮的应用程序的 UI 的侧边栏部分获取输入)

#Make the Key

server <- function(input, output) {
  observeEvent(input$button, {
    key_seed <- round(as.numeric(Sys.time()),0)
    key_name <- paste(name,Sys.Date(),sep="_")
    create.key.pair<-function(keynumber)
    {
      folder<-paste("ODK.KEY",key_name,sep=".")                      #make a folder name
      system(paste("mkdir",folder,sep=" "))                           #create the folder

      name.private.key<-paste("ODK.PRIVATE.KEY.",key_name,".pem",sep = "") #make a name for the keys
      name.public.key<-paste("ODK.PUBLIC.KEY.",key_name,".pem",sep = "")

      keygen.private<-paste("openssl genrsa -out ",folder,"/",name.private.key," 2048",sep="") #create the system call
      system(command = keygen.private) #create the private key

      keygen.public<-paste("openssl rsa -in ",folder,"/",name.private.key," -inform PEM -out ",folder,"/",name.public.key," -outform PEM -pubout",sep="")

      system(command = keygen.public) #create the private key
    }
    create.key.pair(key_seed)
  })
}


shinyApp(ui, server)

我需要一些关于是否 A)我需要在 mainPanel 中添加一些东西来显示/下载输出的文件 B)服务器部分中的代码应该可以工作

我目前无法判断我的错误是在 A 还是 B 中,只是它没有生成密钥(而我的 R 脚本版本可以正常工作)

第一次使用 Shiny,所以任何帮助都非常感激。

【问题讨论】:

  • 在您的代码中调用服务器站点上的输入存在一些问题:input$input_action 而不是 input$button 和 input$name 而不是 name。先改这个,然后就可以开始调试剩下的了
  • 该功能也无法正常工作。 key_name 未指定为参数

标签: r shiny


【解决方案1】:

如果我修复了一些小错误,它在闪亮和通常的 R 脚本中的工作方式相同:

  1. input$input_actioninput$name
  2. key_name 添加到您的函数中

另外,不要在observeEvent 中加载您的函数,因为这会导致您的应用在每次有人点击actionButton 时重新加载该函数。您可以改为在应用启动之前加载一次。

你的代码是:

library(shiny)

create.key.pair<-function(keynumber, key_name)
{
    folder<-paste("ODK.KEY",key_name,sep=".")                      #make a folder name
    system(paste("mkdir",folder,sep=" "))                           #create the folder

    name.private.key<-paste("ODK.PRIVATE.KEY.",key_name,".pem",sep = "") #make a name for the keys
    name.public.key<-paste("ODK.PUBLIC.KEY.",key_name,".pem",sep = "")

    keygen.private<-paste("openssl genrsa -out ",folder,"/",name.private.key," 2048",sep="") #create the system call
    system(command = keygen.private) #create the private key

    keygen.public<-paste("openssl rsa -in ",folder,"/",name.private.key," -inform PEM -out ",folder,"/",name.public.key," -outform PEM -pubout",sep="")

    system(command = keygen.public) #create the private key
}

# Define UI for ODK Encryption app ----

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

    # Application title
    titlePanel("Make ODK Encryption Keys"),

    # Sidebar with a slider input for number of bins
    sidebarLayout(
        sidebarPanel(
            textInput("name",
                      "Enter your name:"),
            actionButton(inputId = "input_action", label = "Generate Keys")

        ),

        mainPanel(

        )
    )
)

#Make the Key

server <- function(input, output) {
    observeEvent(input$input_action, {

        key_seed <- round(as.numeric(Sys.time()),0)
        key_name <- paste(input$name,Sys.Date(),sep="_")
        create.key.pair(key_seed, key_name)
    })
}


shinyApp(ui, server)

【讨论】:

  • 从某种意义上说,它在后台生成密钥 - 我觉得我需要使用 ?downloadhandler 来允许用户生成每个文件?据我所知,每个文件都有两个单独的下载按钮,压缩并不容易?
  • 添加downloadButton 很简单,您只需将actionButton(inputId = "input_action", label = "Generate Keys") 替换为downloadButton("input_action", label = "Generate Keys")。然后,您需要在observeEvent 中指定downloadHandler。为此,您需要重写函数以直接将生成的文件传递给它。因此,它不应该直接保存到您的目录中。
  • 有关闪亮的downloadButton 的示例,请查看官方 RStudio 描述:shiny.rstudio.com/reference/shiny/1.0.4/downloadButton.html
猜你喜欢
  • 2016-01-09
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多