gpt4 book ai didi

r - 如何删除 Shiny 的renderUI中的输入?

转载 作者:行者123 更新时间:2023-12-05 01:20:28 26 4
gpt4 key购买 nike

在我 Shiny 的应用程序中,我有一个使用 renderUI 的动态输入。

这很好用,程序的另一部分捕获了 slider 的输入。

当应用程序状态更改时(例如,当按下“更新模型”按钮时)我仍然需要显示/使用具有类似标签的 slider ,但由于它们是“新的”,因此需要将值重新初始化为零。

问题是 slider 有内存。如果我重复使用相同的 inputId

  paste0(Labv[i], "_v",buttn)

Shiny 将具有与之关联的旧值。

目前我的代码使用变量 buttn绕过问题:每次状态更改时,我都会创建"new" slider 。

另一方面,用户使用应用程序的次数越多,收集到的垃圾就越多。

我尝试使用renderUI将元素列表发送到NULL,尝试发送一个列表
updateTextInput(session, paste0(lbs[i],"_v",buttn),
label = NULL, value = NULL )

tags$div("foo", NULL)但在每种情况下,实际变量都呈现为文本,这是最糟糕的!
# Added simplified example
library(shiny)
library(data.table)

#
dt_ = data.table( Month = month.abb[1:5],
A=rnorm(5, mean = 5, sd = 4),
B=rnorm(5, mean = 5, sd = 4),
C=rnorm(5, mean = 5, sd = 4),
D=rnorm(5, mean = 5, sd = 4),
E=rnorm(5, mean = 5, sd = 4))

dt_[,id :=.I]
dt <- copy(dt_)
setkey(dt_, "Month")
setkey(dt, "Month")

shinyApp(
ui = fluidPage(
fluidRow(
column(4,
actionButton("saveButton", "Update Model"))),
fluidRow(
column(6, dataTableOutput('DT')),
column(3, br(),br(),checkboxGroupInput("pick",h6("Picker"),
month.abb[1:5])),
column(3, uiOutput('foo'))),
fluidRow(
column(4, verbatimTextOutput('vals')))
),

server = function(session,input, output) {
valPpu <- reactiveValues()

valPpu$buttonF <- 1
valPpu$dt_ <- dt_
##
output$DT <- renderDataTable({
if(length(input$pick) > 0 ) {
# browser()
isolate( { labs <- input$pick } ) #
buttn <- valPpu$buttonF

iter <- length(labs)
valLabs <- sapply(1:iter, function(i) {
as.numeric(input[[paste0(labs[i],"_v",buttn)]]) })

if( iter == sum(sapply(valLabs,length)) ) {

cPerc <- valLabs
cPerc <- as.data.table(cPerc)
cPercDt <- cbind(Month=labs,cPerc)

ival <- which(dt[["Month"]]
%in% cPercDt[["Month"]])
setkey(cPercDt, "Month")
for(j in LETTERS[1:5]) set(dt_, i=ival,
j=j, dt[cPercDt][[j]] * (1 + dt_[cPercDt][["cPerc"]]) )
valPpu$dt_ <- dt_
} }

dt_[order(id),]
}, options = list(
scrollX = TRUE,
scrollY = "250px" ,
scrollCollapse = TRUE,
paging = FALSE,
searching = FALSE,
ordering = FALSE )
)
##
output$foo <- renderUI({
if(is.null(input$saveButton)) { return() }
if(length(input$pick) > 0 ) {
labs <- input$pick
iter <- length(labs)
buttn <- isolate(valPpu$buttonF )
valLabs <- sapply(1:iter, function(i) {
if(is.null(input[[paste0(labs[i],"_v",buttn)]] )) {
0
} else { as.numeric(input[[paste0(labs[i],"_v",buttn)]]) }
})
#
toRender <- lapply(1:iter, function(i) {
sliderInput(inputId = paste0(labs[i], "_v",buttn),
label = h6(paste0(labs[i],"")),
min = -1,
max = 1,
step = 0.01,
value = valLabs[i],
# format = "##0.#%",
ticks = FALSE, animate = FALSE)
})

toRender
}
})


observe({

if(is.null(input$saveButton)) { return() }
if(input$saveButton < valPpu$buttonF) { return() }
valPpu$buttonF <- valPpu$buttonF + 1
dt <<- valPpu$dt_
# TODO: add proper saving code
})
}
)

在实际的应用程序中,checkboxGroupInput 也由带有 renderUI 的服务器驱动,并在按下“更新模型”时重置。此外,UI 中还有更多“事件”我没有添加到代码中。

任何的想法?

最佳答案

所以你目前的方法确实有效。 FWIW, slider 已从 HTML 中删除,因此您无需担心。对于存储在 input 中的旧值,如 input[['Jan_v1']]当按钮被点击两次时(你只需要 input[['Jan_v2']] ),我不明白你为什么这么关心它们,除非你的总内存小于几千字节,因为你只需要几个字节来存储这些值.您可能无法从 input 中删除这些值。 ,但我建议你不要花时间在这个问题上,直到它成为一个真正的问题。

关于r - 如何删除 Shiny 的renderUI中的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27678358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com