我想创建一些当用户单击操作按钮时会增加的框。
我尝试创建一个计数器,将其初始化为 1 并将其链接到操作按钮。当我尝试使用计数器时,它给了我错误
library(shiny)
library(DT)
library(readr)
library(shinythemes)
library(shinydashboard)
library(sortable)
testdataset <- data.frame(A = runif(n=4, min=1, max=6),B = runif(n=4, min=1, max=6),C = runif(n=4, min=1, max=6))
ui <- dashboardPage(
dashboardHeader(title = "ShinySem"),
dashboardSidebar(
sidebarMenu(
menuItem("Insert data", tabName = "data"),
menuItem("Choosing variables", tabName = "drag")
)
),
dashboardBody(
tabItems(
tabItem(tabName = "data",
fileInput("infile","Insert your dataset in csv",accept = c(".csv","text/csv","text/comma-separated-values")),
radioButtons("separator","Separator: ",choices = c(";",",",":"), selected=";",inline=TRUE),
dataTableOutput("userfile")),
tabItem(tabName = "drag",
actionButton("addex","Add Latent Exogenous variable"),
actionButton("adden","Add Latent Endogenous variable"),
textOutput("ex"),
uiOutput("bucket"))
)
)
)
server <- function(input,output,session){
#Rendering data
df_uploads <- reactive({
data <- input$infile
if (is.null(data))
return(testdataset)
df <- read.csv(data$datapath, header = TRUE,sep = input$separator)
return(df)
})
output$userfile<- renderDataTable({
df <- df_uploads()
datatable(df)
})
#Render Bucket list and drag and drop
output$bucket <- renderUI(
do.call("bucket_list",args = c(
list(header = "Drag and drop",
group_name = "bucketlistgroup",
orientation = "horizontal",
add_rank_list(
text = "dataset you have insert",
labels = colnames(df_uploads()),
input_id = "starting_variables")),
rank_list_exogenous
)))
#Reactive action button exogenous
counter <- reactiveVal(value = 1) #initializing
observeEvent(input$addex, {
newcounter <- counter() + 1 #adding one by clicking
counter(newcounter)
})
#Reactive ranklist exogneous
rank_list_exogenous <- lapply(1:counter,function(i){
add_rank_list(
text = "Latent Exogenous variable",
labels = NULL,
input_id = "Latent Exogenous variable"
)})
}
shinyApp(ui, server)
如果我用特定的数字替换反应排名列表外源块中的“计数器”,它会很好地工作,所以我认为问题是计数器
我通过修改反应排名列表的创建来解决问题,以便在反应块中使用计数器
server <- function(input,output,session){
#Rendering data
df_uploads <- reactive({
data <- input$infile
if (is.null(data))
return(testdataset)
df <- read.csv(data$datapath, header = TRUE,sep = input$separator)
return(df)
})
output$userfile<- renderDataTable({
df <- df_uploads()
datatable(df)
})
#Render Bucket list and drag and drop
output$bucket <- renderUI(
do.call("bucket_list",args = c(
list(header = "Drag and drop",
group_name = "bucketlistgroup",
orientation = "horizontal",
add_rank_list(
text = "dataset you have insert",
labels = colnames(df_uploads()),
input_id = "starting_variables")),
lapply(1:counterex(), function(i) {
add_rank_list(
text = paste("Latent Exogenous variable", i),
labels = NULL,
input_id = paste0("Latent_Exogenous_variable", i)
)
}),
lapply(1:counteren(), function(i){
add_rank_list(
text = paste("latent Endogenous variable", i),
labels = NULL,
input_id = paste0("Latent_Endogenous_variable", i)
)
})
)))
#Reactive action button exogenous
counterex <- reactiveVal(value = 1) #initializing
observeEvent(input$addex, {
newcounterex <- counterex() + 1 #adding one by clicking
counterex(newcounterex)
})
#Reactive action button endogenous
counteren <- reactiveVal(value = 1) #initializing
observeEvent(input$adden, {
newcounteren <- counteren() + 1
counteren(newcounteren)
})
}
shinyApp(ui, server)