【问题标题】:Error in lis() <- reactive({ : invalid (NULL) left side of assignmentlis() <- reactive({ : invalid (NULL)) 左侧赋值错误
【发布时间】:2020-12-06 03:19:54
【问题描述】:

我知道这个问题已经出现过几次了,例如Markov Model diagram directly from data (makovchain or deemod package?)。我试图根据这些解决方案实施补救措施,但这仍然不起作用。显然,我遗漏了一些东西,如果能提供任何帮助,我将不胜感激!

简而言之,我正在尝试在 Shiny 应用中为 heemod::define_transition 提供 state_names。

这是我的代码:


library(heemod)
library(diagram)
library(shiny)

ui=shinyUI(fluidPage(
  titlePanel("Markov Diagram Creator"),
  fluidRow(
    sidebarPanel(
      textAreaInput("statenames_1",label = "Enter state names here...", value = "H,S1,S2,D"),
      actionButton("go","Go")
    ),
    
    mainPanel(
      
      hr(),
      plotOutput("plot")
      
    )
  )))

server=function(input,output){
  
  state_names <- reactive( {
    unlist(strsplit(x=input$statenames_1,split = "[[:punct:]]"))
  })
  
  len_states <- reactive({length(state_names())}) 
  states <- reactive({state_names()})
  statenames <- reactive({list(states(), states())})
  markovTransitionMatrix <- reactive({matrix(0.25, nrow = len_states(), ncol = len_states(), dimnames = statenames())})
  
  lis <- reactive({ as.list( markovTransitionMatrix() ) })
  lis()$state_names  <-  reactive({ statenames() }) # Error in lis() <- reactive({ : invalid (NULL) left side of assignment
  
  output$plot <- renderPlot({
    plot(do.call( define_transition,  lis() ), cex=0.75, ylim = c(0,.4))
    
  })
  
  
}

shinyApp(ui,server)

【问题讨论】:

  • 我已将textAreaInput 中的statenames ID 重命名为statenames_1。还取消注释有问题的行以重新创建错误。
  • 我可能会做 lis2 &lt;- reactive({ z &lt;- list(); z$state_names &lt;- statenames(); z; }) 并依赖 lis2() 从那里开始。
  • 或者只是在原来的lis()分配中修复它。

标签: r shiny reactive


【解决方案1】:

无需测试,我认为这将满足您的需求:

  lis <- reactive({
    out <- as.list( markovTransitionMatrix() )
    out$state_names <- statenames()
    out
  })
  # delete:   lis()$state_names  <-  reactive({ statenames() })

基本原理是一般情况下(shiny 也不例外),实际上没有办法将属性 ($state_names) 分配给函数调用 (lis())。 R 中的一些函数看起来像是您正在分配给一个函数(例如,names(z) &lt;- c("a","b")),但它们是特殊函数,并且该命名法/语法不适用于 shiny 反应变量。

作为旁注,虽然一方面我看到许多 shiny 反应性块试图在其中做太多事情,但我想知道您的一些反应性块是否采取了“太小的步骤”。例如,

  ### no longer needed ---v
  # len_states <-
  # states <-
  # statenames <-
  # markovTransitionMatrix <-
  ### no longer needed ---^
  lis <- reactive({
    states <- state_names()
    statenames <- list(states, states)
    mTM <- as.list(matrix(0.25, nrow = length(states), ncol = length(states), dimnames = statenames))
    mTM$state_names <- statenames
    mTM
  })

这很可能会以另一种方式摇摆得太远,但是你的一些反应块......相当微不足道,如果初始/较小的块中的一个只被链中的下一个依赖,然后将它们分开几乎没有什么好处,并且可能会影响一分钟(!)的性能。 (好吧,真的很分钟......关键是如果你不需要,不要在反应中忙工作。)

【讨论】:

  • 谢谢 r2evans。稍作调整即可完成工作:lis &lt;- reactive({ out &lt;- as.list( markovTransitionMatrix() ) out$state_names &lt;- state_names() out })
  • 我也接受你关于反应块大小的观点 - 谢谢。
  • (这和我的第一个代码块不一样吗?)如果这回答了您的问题,请接受答案。谢谢!
猜你喜欢
  • 2012-07-26
  • 2017-04-26
  • 2016-06-16
  • 2019-02-22
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多