闪亮:让用户输入未来的功能
Shiny: Getting a user input into a future function
我正在构建一个闪亮的应用程序,用户可以在其中上传一堆数据,然后选择应该计算的数据。计算本身相当耗时,应存储在列表中。为了在计算过程中保持闪亮的响应(对于用户和其他用户),我尝试使用 promises
和 future
。问题是我无法输入 future
函数。我总是得到 Warning: Error in $: Can't access reactive value 'mem_pos' outside of reactive consumer. i Do you need to wrap inside reactive() or observe()? [No stack trace available]
。我试图阅读有关 reactive
的内容,但我只是卡住了。
这是问题的一个最小示例(为了显示它,每个列表只有一个值):
library(shiny)
library(promises)
library(future)
plan(multisession)
# example function
subfct = function(n) {
Sys.sleep(3)
return(n*2)
}
# shiny page
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput("mem_pos", min = 1, max = 30, value = 1, label="mem pos"),
actionButton("mem_button", label="set mem value")
),
mainPanel(
tableOutput("result")
)
)
)
server <- function(input, output) {
superval = reactiveValues(mem = rep(list(0), 10))
# set the future calculations
observeEvent(input$mem_button, {future({return(subfct( input$mem_pos ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) # here lies the problem
# show result table
observe( {output$result = renderTable({unlist(superval$mem)})})
}
# Run the application
shinyApp(ui = ui, server = server)
如果有问题的线路被 observeEvent(input$mem_button, {future({return(subfct( 5 ))}) %...>% {superval$mem[[input$mem_pos]] = .}})
交换,它基本上可以工作。但是我无法让用户输入该功能。我很感激 reactive
对我的具体问题的直接帮助或解释。
您可以尝试使用 shinyjs 包中的 delay() 函数。这使代码仅在设置的时间过去后才变为 运行。例如
图书馆(闪亮)
图书馆(闪亮的)
ui<-fluidPage(useShinyjs,
...)
服务器<-函数(输入、输出、会话){
延迟(毫秒=,
...)
}
shinyApp(ui,服务器)
我解决了。不完全确定为什么,但 isolate
可以解决问题。
此代码对我有用:
library(shiny)
library(promises)
library(future)
plan(multisession)
# example function
subfct = function(n) {
Sys.sleep(3)
return(n*2)
}
# shiny page
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput("mem_pos", min = 1, max = 30, value = 1, label="mem pos"),
actionButton("mem_button", label="set mem value")
),
mainPanel(
tableOutput("result")
)
)
)
server <- function(input, output) {
superval = reactiveValues(mem = rep(list(0), 10))
# set the future calculations
observeEvent(input$mem_button, {future({return(subfct( isolate(input$mem_pos) ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) # here lied the problem
# show result table
observe( {output$result = renderTable({unlist(superval$mem)})})
}
# Run the application
shinyApp(ui = ui, server = server)
我正在构建一个闪亮的应用程序,用户可以在其中上传一堆数据,然后选择应该计算的数据。计算本身相当耗时,应存储在列表中。为了在计算过程中保持闪亮的响应(对于用户和其他用户),我尝试使用 promises
和 future
。问题是我无法输入 future
函数。我总是得到 Warning: Error in $: Can't access reactive value 'mem_pos' outside of reactive consumer. i Do you need to wrap inside reactive() or observe()? [No stack trace available]
。我试图阅读有关 reactive
的内容,但我只是卡住了。
这是问题的一个最小示例(为了显示它,每个列表只有一个值):
library(shiny)
library(promises)
library(future)
plan(multisession)
# example function
subfct = function(n) {
Sys.sleep(3)
return(n*2)
}
# shiny page
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput("mem_pos", min = 1, max = 30, value = 1, label="mem pos"),
actionButton("mem_button", label="set mem value")
),
mainPanel(
tableOutput("result")
)
)
)
server <- function(input, output) {
superval = reactiveValues(mem = rep(list(0), 10))
# set the future calculations
observeEvent(input$mem_button, {future({return(subfct( input$mem_pos ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) # here lies the problem
# show result table
observe( {output$result = renderTable({unlist(superval$mem)})})
}
# Run the application
shinyApp(ui = ui, server = server)
如果有问题的线路被 observeEvent(input$mem_button, {future({return(subfct( 5 ))}) %...>% {superval$mem[[input$mem_pos]] = .}})
交换,它基本上可以工作。但是我无法让用户输入该功能。我很感激 reactive
对我的具体问题的直接帮助或解释。
您可以尝试使用 shinyjs 包中的 delay() 函数。这使代码仅在设置的时间过去后才变为 运行。例如
图书馆(闪亮) 图书馆(闪亮的) ui<-fluidPage(useShinyjs, ...) 服务器<-函数(输入、输出、会话){ 延迟(毫秒=, ...) } shinyApp(ui,服务器)
我解决了。不完全确定为什么,但 isolate
可以解决问题。
此代码对我有用:
library(shiny)
library(promises)
library(future)
plan(multisession)
# example function
subfct = function(n) {
Sys.sleep(3)
return(n*2)
}
# shiny page
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput("mem_pos", min = 1, max = 30, value = 1, label="mem pos"),
actionButton("mem_button", label="set mem value")
),
mainPanel(
tableOutput("result")
)
)
)
server <- function(input, output) {
superval = reactiveValues(mem = rep(list(0), 10))
# set the future calculations
observeEvent(input$mem_button, {future({return(subfct( isolate(input$mem_pos) ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) # here lied the problem
# show result table
observe( {output$result = renderTable({unlist(superval$mem)})})
}
# Run the application
shinyApp(ui = ui, server = server)