我试图在昨天发布的一个问题中跟踪评论者给出的建议(名为:warmoverflow):How to pass values from input boxes of shiny UI back into the variables in an R script and run it?
我决定在一个简短的例子中尝试他首先提出的方法。所以,我创建了一个R脚本mathops.R
,其中包含一个带有次要数学运算的函数。它如下:
mathops.R:
mathops <- function(a,b) {
print(paste0("Addition of two number is: ", a+b))
print(paste0("Multiplication of two number is: ", a*b))
}
我开发了一个带有两个文本框的UI,从中可以输入上面提到的变量a
和b
,还有一个动作按钮来显示输出。它如下:
ui.R:
library(shiny)
shinyUI(fluidPage(
headerPanel("Inputting from Interface to Script"),
sidebarPanel(
#'a' input
textInput(inputId = "a",
label = h4("Enter a:"),
value = ""),
textInput(inputId = "b",
label = h4("Enter b:"),
value = ""),
actionButton(inputId = "input_action", label = "Show Inputs")),
mainPanel(
h2("Input Elements"))
textOutput("td"))
))
现在按照他的建议,我正在尝试为server.R
文件开发代码:
server.R:
library(shiny)
source(mathops.R)
shinyServer(function(input, output) {
a <- eventReactive( input$input_action, {
input$a
})
b <- eventReactive( input$input_action, {
input$b
})
output$td <- renderDataTable({
mathops()
})
}
但这是我面临僵局的地方。我只是想不出如何将mathops.R
脚本连接到server.R
文件,以便它将来自UI上的输入框的输入并将这些值传递给变量{{上面显示的R脚本中的a
函数的1}}和b
。
我是新生的闪亮之作。我在这里错过或误解了什么?如何解决这种情况?
请帮忙!
感谢。
答案 0 :(得分:1)
你必须做几件事:
textInput
numericInput
切换为ui.R
mainPanel
参数未正确解析renderPrint
代替renderDataTable
a
和b
称为被动对象,但mathops
只是一个常规功能: 注意:为简单起见,我将mathops
函数定义移至server.R
<强> ui.R 强>
library(shiny)
shinyUI(fluidPage(
headerPanel("Inputting from Interface to Script"),
sidebarPanel(
numericInput(inputId = "a",
label = h4("Enter a:"),
value = ""),
numericInput(inputId = "b",
label = h4("Enter b:"),
value = ""),
actionButton(inputId = "input_action", label = "Show Inputs")),
mainPanel(
h2("Input Elements"),
textOutput("td")
)
))
<强> server.R 强>
library(shiny)
mathops <- function(a, b) {
print(paste0("Addition of two number is: ", a + b))
print(paste0("Multiplication of two number is: ", a * b))
}
shinyServer(function(input, output) {
a <- eventReactive( input$input_action, {
input$a
})
b <- eventReactive( input$input_action, {
input$b
})
output$td <- renderPrint({
mathops(a(), b())
})
})
答案 1 :(得分:1)
这是一个工作版本,其中包含原始代码的一些更改。正如在另一个答案中指出的那样,代码中存在一些错误。另外,我将textOutput更改为htmlOutput。在server.R中,我将所有代码放在observeEvent
环境中。
通常,您的R脚本中的方法需要返回适合server.R
中的处理的内容。例如,在这种情况下,它返回一个字符串,server.R
呈现为文本,而ui.R
依次呈现为HTML。
server.R
中可访问的任何变量/数据(包括source
的任何文件)都可以在ui中显示。你需要的是(1)一个合适的渲染方法,在server.R
(2)一个合适的输出容器中呈现这些数据,以保持输出显示在ui.R
ui.R
library(shiny)
shinyUI(fluidPage(
headerPanel("Inputting from Interface to Script"),
sidebarPanel(
#'a' input
numericInput(inputId = "a",
label = h4("Enter a:"),
value = 3),
numericInput(inputId = "b",
label = h4("Enter b:"),
value = 4),
actionButton(inputId = "input_action", label = "Show Inputs")),
mainPanel(
h2("Input Elements"),
htmlOutput("td")),
# use dataTableOuput to display the result of renderDataTable. Just like the render methods, there are many output methods available for different kind of outputs. See Shiny documentation.
dataTableOutput("table")
))
server.R
library(shiny)
source("mathops.R")
shinyServer(function(input, output) {
observeEvent(input$input_action, {
a = input$a
b = input$b
output$td <- renderText({
mathops(a,b)
})
})
# Use renderDataTable to convert mat2 to a displayable object. There are many other render methods for different kind of data and output, you can find them in Shiny documentation
output$table <- renderDataTable(data.frame(mat2))
})
mathops.R
mathops <- function(a,b) {
return(paste0("Addition of two number is: ", a+b, br(), "Multiplication of two number is: ", a*b))
}
mat1 <- matrix(sample(1:16), ncol=4)
mat2 <- matrix(sample(1:25), ncol=5)