我在.rds文件中存储了几个表,我希望在Shiny会话中使用readRDS导入。因此我定义了以下全局函数:
get.station <- function(sname){
file.name <- paste(sname".rds", sep="")
return(readRDS(file.name))
}
在服务器功能中我定义了无功值:
st.reactive <- reactiveValues(get.station(input$station.sel))
其中input$station.sel
来自使用selectInput(...)
的ui。这会导致以下错误消息:
Operation not allowed without an active reactive context.
(You tried to do something that can only be done from inside
a reactive expression or observer.)
如果我使用reactive()
定义此函数,则此错误消息甚至不会消失:
get.station <- reactive({
file.name <- paste(input$station.sel".rds", sep="")
return(readRDS(file.name))
})
并在服务器内:
st.reactive <- reactiveValues(data=get.station())
你有任何帮助吗?
答案 0 :(得分:0)
你有正确的想法,只需将函数放在reactive
或observe_
函数中。虽然您可以在初始调用中定义reactiveValues
,但在我看来,最好将反应值对象设置为空,然后使用<-
符号执行所有分配。
这种混淆来自这样一个事实,即尽管它的名字,reactiveValues
不是反应性表达。它生成一个reactiveValues对象,可以存储反应值,但它只运行一次,不检查其值是否无效。
在您的情况下,我会执行以下操作:
rv <- reactiveValues()
rv$st.reactive <- observe({get.station(input$station.sel)})