ui code:
===
library(shiny)
shinyUI(
# Use a fluid Bootstrap layout
fluidPage(
# Generate a row with a sidebar
sidebarLayout(
# Define the sidebar with one input
sidebarPanel(
sliderInput("capacity", "Current Capacity:",
min=0, max=100, value=10),
c(list(
textInput("service", "Service Component Name", ""),
actionButton("addbtn", "Add Component"))),
#lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
br(),
br(),
br(),
br(),
br(),
actionButton("calcbtn", "Calculate Projection")
),
# Create a spot for the barplot
mainPanel(
textInput("inputWork","Volume", width="200px"),
textInput("inputGrowth","Growth Rate", width="100px"),
lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
#tags$p("Web"),
#verbatimTextOutput("input_type_text")
)
)
)
)
server <- function(input, output)
{
observeEvent(input$addbtn, {
n <- isolate(input$addbtn)
if (n == 0) return()
# create n-th pair of text input and output
output[[paste0("ui", n)]] <- renderUI(
list(textInput(paste0("textin", n), isolate(input$service)),
textOutput(paste0("textout", n))))
# display something in the output
output[[paste0("textout", n)]] <- renderText({
work<-as.numeric(input$inputWork)
growth<-as.numeric(input$inputGrowth)
print(growth)
#paste("projection", (100+growth)*as.numeric(input[[paste0("textin", n)]]))
})
})
observeEvent(input$calcbtn, {
n <- isolate(input$calcbtn)
if (n == 0) return()
output[[paste0("textout", n)]] <- renderText({
work<-as.numeric(input$inputWork)
growth<-as.numeric(input$inputGrowth)
project<-growth+as.numeric(input$service)
print(growth)
print(project)
paste("projection", ((1+growth/100)*as.numeric(input[[paste0("textin", n)]])))
})
})
}
这就是我想要做的。此代码将具有初始文本框和提交按钮。用户在第一个输入文本中放置一个文本,单击提交按钮,在主面板中生成一个新文本。用户可以多次执行此操作以在主面板中创建多个textInput框。
我还在主面板顶部有一个静态的另一个inputText框标记为Workload。
所以,这就是我想要做的事情:
例如,我的工作量中有数据,我已生成Web_server,App_server textInput框。我将从工作负载中获取数据并通过web_server中的数据进行分配,并将其显示在web_server textInput框旁边(在文本框中显示数据),对app_server textInput框执行相同的操作。
我有什么想法可以做到闪亮吗?这是我想要完成的形象。给定用户的工作量增长率和用户输入部分的其他输入,我将不得不计算并填充相应的文本框。
答案 0 :(得分:2)
以下代码实现:
注意:
renderText
的内容。textOutput
来显示计算结果,但您的意图可能是使用textInput
。通常,您应该使用textOutput
来显示内容,尽管可以像输出一样使用输入对象。 textInput
,但如果输入应始终为数字,则可以使用numericInput
作为评论之一。 玩得开心。
library(shiny)
ui <- c(list(
textInput("service", "Service Component Name", ""),
actionButton("addbtn", "add")),
lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
)
server <- function(input, output)
{
observeEvent(input$addbtn, {
n <- input$addbtn
if (n == 0) return()
if (n > 10) return()
# create n-th pair of text input and output
output[[paste0("ui", n)]] <- renderUI(
list(textInput(paste0("textin", n), isolate(input$service)),
textOutput(paste0("textout", n))))
# display something in the output
output[[paste0("textout", n)]] <- renderText({
paste("you wrote", input[[paste0("textin", n)]])
})
})
}
runApp(list(ui = ui, server = server))
答案 1 :(得分:1)
实现您的愿望的一些提示是:
renderText
正在检查其组件的更改,并在修改组件的值时执行。这就是input$textin1
的原因,在文本输入中输入内容后立即进行更新。isolate
阻止组件触发执行。使用isolate(input$textin1)
时,修改文本输入不会更新textOutput
。renderText
的按钮,您只需在renderText
内添加按钮即可。在内部,单击按钮时,其值会递增。因此,它是函数正在检查的组件的值修订,执行发生。textin1
,textin2
,... 以下代码实现了这一点。检查与上一个答案的区别。
library(shiny)
ui <- c(list(
textInput("service", "Service Component Name", ""),
actionButton("addbtn", "add"),
actionButton("calcbtn", "calc")),
lapply(seq(10), function(i) uiOutput(paste0("ui", i)))
)
server <- function(input, output)
{
observeEvent(input$addbtn, {
n <- input$addbtn
if (n == 0) return()
if (n > 10) return()
# create n-th pair of text input and output
output[[paste0("ui", n)]] <- renderUI(
list(textInput(paste0("textin", n), isolate(input$service)),
textOutput(paste0("textout", n))))
# display something in the output
output[[paste0("textout", n)]] <- renderText({
input$calcbtn
paste("you wrote", isolate(input[[paste0("textin", n)]]))
})
})
}
runApp(list(ui = ui, server = server))