在 Shiny 中,提交按钮没有运行

Posted

技术标签:

【中文标题】在 Shiny 中,提交按钮没有运行【英文标题】:In Shiny, the submit button isn't running 【发布时间】:2021-08-02 21:05:37 【问题描述】:

我编写了一个将 PDF 表转换为 CSV 的 R 脚本 (MAIN.R)。当我将 MAIN.R 作为单个文件运行时,它运行良好。我已经试过很多次了。

目前,我正在开发一个使用“MAIN.R”作为源并以 pdf 文件作为输入的 R 闪亮应用程序。当我按下提交按钮时,输出应该出现在主面板中。不幸的是,提交按钮没有按预期工作。

由于我是 Shiny 的新手,有人可以帮助我吗?

UI.R

shinyUI(fluidPage(
  titlePanel("DATASET CONVERSION"),
  
  sidebarLayout(
    fileInput("filein", label = h2("Select a file to convert.")),
    submitButton("Submit")
  ),
  mainPanel(
    tableOutput("Dataset")
  )
)
)

Server.R

source("MAIN.R")
shinyServer(function(input, output) 
  
  outputdf <-  reactive( input$filein   
  )    
  output$Dataset <- renderTable( 
    outputdf()
  )
)

【问题讨论】:

您能否包含MAIN.R 文件来制作MRE?谢谢! outputdf() 是如何定义的?我想在采购功能时出了点问题。另请参阅 submitButton 是 deprecated @starja,它没有弃用,它“通常不鼓励使用更通用的actionButton()(尽管情绪仍然)。 【参考方案1】:

您的提交按钮当前没有链接到任何东西,所以它不会做任何事情。如果我正确阅读了代码,那么您只是获取输入数据集并将其存储为 outputdf 的输出。然后,您的 output$Dataset 只会拾取该 outputdf 并按原样显示它,而无需对其进行任何工作。

您使用这样的操作按钮:

## In UI.R
actionButton("execute", "Execute the Main Function")

## In Server.R
observeEvent(input$execute, 
    ## Do stuff here
  )

请注意,actionButton 有两个参数,inputID(这是您引用它的方式)和要在顶部显示的文本。例如,对于 input$filein,'filein' 是 inputID。

在 Server.R 中,observeEvent 不会做任何事情,直到它检测到 input$execute 的变化,这种变化发生在有人单击按钮时。那是你把代码放在哪里做的事情。

现在,在 output$Dataset 中,您需要访问在该 observeEvent 中所做的任何事情的结果。一种方法是使用 reactiveValue。这就像一个反应式,但它不是一个函数,而是一个数据元素。将其初始化为空数据框,然后在 observeEvent 中更新它。像这样的:

## In Server.R
treated_output <- reactiveValue(data.frame())

observeEvent(input$execute, 
    ## Run the function on the file
    updated <- main_function(input$filein)
    
    # Update your reactiveValue
    treated_output(updated)
  )

output$Dataset <- renderTable( 
    treated_output()
  )

这有意义吗?

【讨论】:

据我了解,documentation、submitButton 独立存在,所有反应在按下之前不会更新;但总的来说,actionButton 的解决方案更好 是的,一切顺利,@Aqeel Padaria。非常感谢。

以上是关于在 Shiny 中,提交按钮没有运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有按钮的情况下提交表单?

在 Shiny 中,避免 selectInput 下拉菜单与其下方的操作按钮重叠

如何从 jquery 部分激活提交按钮

如何在 WebBrowser 中以编程方式提交没有提交按钮的表单

有没有办法用 1 个提交按钮 mvc 提交 3 个表单

通过单击提交按钮在 Django 网站中运行 Python 脚本