R将反应值指定给粘贴的对象

R将反应值指定给粘贴的对象,r,shiny,lapply,reactive,R,Shiny,Lapply,Reactive,我正在构建一个闪亮的应用程序,它由几个重复的输入和输出填充。我没有反复复制和粘贴代码,而是使用lappy()生成输入和输出。这在一定程度上是可行的,但我希望根据用户输入进行预测,然后将这些预测存储为反应对象,由许多输出调用(例如,打印、打印和组合预测)。在这里,在lappy()函数中指定反应对象似乎有问题。我觉得assign()函数不喜欢reactive()对象 我在下面使用mtcars编写了一个简单的问题工作示例。此代码工作正常,但我想放弃pred1和pred2的显式赋值,并用lapply()

我正在构建一个闪亮的应用程序,它由几个重复的输入和输出填充。我没有反复复制和粘贴代码,而是使用
lappy()
生成输入和输出。这在一定程度上是可行的,但我希望根据用户输入进行预测,然后将这些预测存储为反应对象,由许多输出调用(例如,打印、打印和组合预测)。在这里,在
lappy()
函数中指定反应对象似乎有问题。我觉得
assign()
函数不喜欢
reactive()
对象

我在下面使用
mtcars
编写了一个简单的问题工作示例。此代码工作正常,但我想放弃
pred1
pred2
的显式赋值,并用
lapply()
函数替换。我知道在这个简单的例子中,在
output$out
对象内部进行预测会更容易,但在我的实际应用程序中,我需要将预测对象调用到多个输出中。任何帮助都将不胜感激

library(shiny)
ui = fluidPage(
      # slider input for horse power to predict with...
      column(3,lapply(1:2, function(i) {
        sliderInput(paste0('hp', i), paste0('Select HP', i), min = 0, max = 300, value = 50)
      })
    ),

      # output display
      column(3,lapply(1:2, function(i) {
        uiOutput(paste0('out', i))
      })
    )

)

server = function(input, output, session) {

 # # I can work pred out separately like this...
 # pred1 <- reactive({
 #     predict(lm(mpg ~ hp, data = mtcars),
 #             newdata = data.frame(hp = input$hp1), se.fit = TRUE)
 #
 # })
 #
 # pred2 <- reactive({
 #   predict(lm(mpg ~ hp, data = mtcars),
 #           newdata = data.frame(hp = input$hp2), se.fit = TRUE)
 #
 #})

  # but I want to create pred1 and pred2 in one go...something like this:
  lapply(1:2, function(i){
     assign(paste0("pred",i), reactive({
       predict(lm(mpg ~ hp, data = mtcars),
               newdata = data.frame(hp = input[[paste0("hp",i)]]), se.fit = TRUE)
       }))
   })

  # output
  lapply(1:2, function(i){
    output[[paste0("out",i)]] <- renderText({
      paste0("MPG with HP",i," = ", round(get(paste0("pred",i))()$fit,0), " (", 
                   round(get(paste0("pred",i))()$fit - 1.96 * get(paste0("pred",i))()$se.fit,0), ", ",
                   round(get(paste0("pred",i))()$fit + 1.96 * get(paste0("pred",i))()$se.fit,0), ")")

      })
      })

}


# Compile
shinyApp(
  ui = ui,
  server = server
)
库(闪亮)
ui=fluidPage(
#滑块输入马力预测与。。。
柱(3,lappy)(1:2,函数(i){
滑块输入(粘贴0('hp',i),粘贴0('Select hp',i),最小值=0,最大值=300,值=50)
})
),
#输出显示
柱(3,lappy)(1:2,函数(i){
uiOutput(粘贴0('out',i))
})
)
)
服务器=功能(输入、输出、会话){
##我可以像这样单独工作。。。

#pred1这是使用reactiveValues()的解决方案:

库(闪亮)
ui=fluidPage(
#滑块输入马力预测与。。。
柱(3,lappy)(1:2,函数(i){
滑块输入(粘贴0('hp',i),粘贴0('Select hp',i),最小值=0,最大值=300,值=50)
})
),
#输出显示
柱(3,lappy)(1:2,函数(i){
uiOutput(粘贴0('out',i))
})
)
)
服务器=功能(输入、输出、会话){

我认为最好的方法是在
reactiveValues()中创建一个
list()
并将它们分配到列表中,就像您在shiny外所做的那样,…您没有提到任何错误或不希望出现的结果。谢谢,我已经编辑生成了一个错误,工作代码被注释掉了。这篇文章是关于效率而不是错误修复,很抱歉造成混淆。
library(shiny)
ui = fluidPage(
  # slider input for horse power to predict with...
  column(3,lapply(1:2, function(i) {
    sliderInput(paste0('hp', i), paste0('Select HP', i), min = 0, max = 300, value = 50)
  })
  ),

   #output display
   column(3,lapply(1:2, function(i) {
     uiOutput(paste0('out', i))
   })
   )
)

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

   outOjbects <- paste("pred", paste(1:2), sep = "")

   lapply(1:2, function(i){
     predReactive[[outOjbects[i]]] <- reactive({
       predict(lm(mpg ~ hp, data = mtcars),
               newdata = data.frame(hp = input[[paste0("hp",i)]]), se.fit = TRUE) 
     })
   })

  # output
   lapply(1:2, function(i){
     output[[paste0("out",i)]] <- renderText({
       paste0("MPG with HP",i," = ", round(predReactive[[outOjbects[i]]]()$fit,0), " (", 
              round(predReactive[[outOjbects[i]]]()$fit - 1.96 * predReactive[[outOjbects[i]]]()$se.fit,0), ", ",
              round(predReactive[[outOjbects[i]]]()$fit + 1.96 * predReactive[[outOjbects[i]]]()$se.fit,0), ")")

     })
   })

}


shinyApp(ui = ui, server = server)