如何调试R脚本

时间:2018-08-21 11:25:38

标签: r plotly

我制作了一个小模拟器来教授随机性下的人口动态基础知识。对于里克方程式,这是一个简单的方法。它可以在linux上运行,但是在其他环境(macos,win)下运行时出现严重错误。

所以,我想知道我最好的选择是调试此错误:

<simpleError in is.list(x): object of type 'closure' is not subsettable>

这是代码。我怀疑在R中的绘图库上有任何提示吗?

    # Ejercicio para ensenar curvas de crecimiento poblacional
    # _author_ = horacio.samaniego@gmail.com
    # _date_ = August 2018

    # Check whether required packages are installed
    list.of.packages <- c("manipulateWidget", "plotly")
    new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
    if(length(new.packages)) install.packages(new.packages)

    # librerias requeridas
    library(manipulateWidget)
    library(plotly)

    # Simulador
    crecLogistico <-  function(t=80,r=1,n0=10,K=60,d=0){
      # Simulacion de crecimiento poblacional con tasa de crecimiento (r) variable
      # que simula variabilidad (estocasticidad ambiental)
      # t, numero de generaciones a simular
      # r, tasa intrinsica de crecimiento
      # n0, abundancia inicial
      # K, capacidad de carga
      # d, estocasticidad
      N <- matrix(n0,ncol=t,nrow=1) # vector con tamano poblacional (abundancia) inicial
      R <- matrix(NA,ncol=t,nrow=1) # vector con tasas de crecimiento
      for(i in 1:t) {
        if(d>0) R[i] <- rnorm(1,mean=r,sd=d) else R[i] <- r
        # N[i+1] <- N[i]+N[i]*R[i]*(1-N[i]/K) # Logistica
        N[i+1] <- N[i]*exp(R[i]*(1 - N[i]/K))  # Ricker
      }
      res <- matrix(c(1:t,N[-(t+1)],R),ncol=3)
      res <- as.data.frame(res)
      names(res) <- c("t","Abundancia","r")
      return(res)
    }

## Plot de Crecimiento Logistico
if ( require(plotly) ) {
  manipulateWidget({
    # Modela abundancias
    res = crecLogistico(n0=n0,t=t,r=r,K=K,d=d)
    # Colecta informacion para construir mapa logistico
    mapa = data.frame("N_1"=res$Abundancia[-t],"N_0"=res$Abundancia[-1])
    combineWidgets( # crea ventanas donde plotear (proporcion 3:1). Una grande a la izq y otra con 2 lineas a la dcha (1:1)
      ncol = 2,colsize=c(3,1),
      # Evolucion temporal de poblacion
      p = plot_ly(res[rango[1]:rango[2],],x=~t,y=~Abundancia,type="scatter",
              mode="lines+markers",line=~r,color=~r), # %>%
        # agrega linea para remarcar abundancia = 0
        add_segments(p, x = rango[1], xend = rango[2], y = 0, yend = 0,mode="lines") %>%
        # muestra escocasticidad a cada tiempo segun color
       colorbar(title="Tasa de Crecimiento") %>%
       layout(title="Crecimiento Logistico",showlegend = FALSE,yaxis=list(zerolinecolor=toRGB("red"))),
      combineWidgets(
        ncol = 1,
        # histograma de estocasticidad a lo largo de todo el tiempo
        plot_ly(res,x=~r,type="histogram") %>%
          layout(title="Tasa de Crecimiento"),
        # mapa logistico, muestra estados estacionarios en primer orden, de t-a a t
        plot_ly(mapa,x=~N_1,y=~N_0,type="scatter",mode="markers") %>%
          add_segments(x=0,xend=max(res$Abundancia),y=0,yend=max(res$Abundancia)) %>%
          layout(title="Mapa Logistico", xaxis = list(title = "abundancia (t)"),
                 yaxis = list(title="abundancia (t-1)"))
      )
    )
  },
  n0  = mwNumeric(100,  min =  2, step = 1    , label = "Poblacion Inicial"),
  t   = mwNumeric(100,  min =  2, step = 1    , label = "Generaciones (t)"),
  r   = mwNumeric(0.9,  min = -4, step = 0.05 , label = "Tasa de Crecimiento (r)"),
  K   = mwNumeric(60,   min = 5,  step = 2,     label = "Capacidad de Carga"),
  d   = mwNumeric(0.05, min =  0, step = 0.05 ,label = "Estocasticidad"),
  rango = mwSlider(0, t, c(1, t),label="Generaciones a Visualizar")
  )
}

将报告...非常感谢!

1 个答案:

答案 0 :(得分:0)

好,我遇到了问题...问题是Linux的R(或rstudio)中的plotly对plot_ly中的“ line”标志不太挑剔,这是macOS严格执行的。

很遗憾,我没有经过调试代码的培训,也无法使用此处提到的标准工具来诊断出这一点(尽管会学到!)

将行重铸为此:

plot_ly(res[rango[1]:rango[2],],x=~t,y=~Abundancia,type="scatter", mode="lines+markers",color=~r) %>%

完成了所有的花招。

谢谢

为防万一,我将在此处复制方程式浏览器

# Ejercicio para ensenar curvas de crecimiento poblacional
# _author_ = horacio.samaniego@gmail.com
# _date_ = August 2018

# Check whether required packages are installed
list.of.packages <- c("manipulateWidget", "plotly")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

# librerias requeridas
library(manipulateWidget)
library(plotly)

# Simulador
crecLogistico <-  function(t=80,r=1,n0=10,K=60,d=0){
  # Simulacion de crecimiento poblacional con tasa de crecimiento (r) variable
  # que simula variabilidad (estocasticidad ambiental)
  # t, numero de generaciones a simular
  # r, tasa intrinsica de crecimiento
  # n0, abundancia inicial
  # K, capacidad de carga
  # d, estocasticidad
  N <- matrix(n0,ncol=t,nrow=1) # vector con tamano poblaciona (abundancia) inicial
  R <- matrix(NA,ncol=t,nrow=1) # vector con tasas de crecimiento
  for(i in 1:t) {
    if(d>0) R[i] <- rnorm(1,mean=r,sd=d) else R[i] <- r # adds stochasticity
    # N[i+1] <- N[i]+N[i]*R[i]*(1-N[i]/K) # Logistica
    N[i+1] <- N[i]*exp(R[i]*(1 - N[i]/K))  # Ricker
  }
  res <- matrix(c(1:t,N[-(t+1)],R),ncol=3)
  res <- as.data.frame(res)
  names(res) <- c("t","Abundancia","r")
  return(res)
}

## Plot de Crecimiento Logistico
if ( require(plotly) ) {
  manipulateWidget({
    # Modela abundancias
    res = crecLogistico(n0=n0,t=t,r=r,K=K,d=d)
    # Colecta informacion para construir mapa logistico
    mapa = data.frame("N_1"=res$Abundancia[-t],"N_0"=res$Abundancia[-1])
    combineWidgets( # crea ventanas donde plotear (proporcion 3:1). Una grande a la izq y otra con 2 lineas a la dcha (1:1)
      ncol = 2,colsize=c(3,1),
      # Evolucion temporal de poblacion
      plot_ly(res[rango[1]:rango[2],],x=~t,y=~Abundancia,type="scatter", mode="lines+markers",color=~r) %>%
       # # muestra escocasticidad a cada tiempo segun color
    colorbar(title="Tasa de Crecimiento") %>%
    layout(title="Crecimiento Logistico",showlegend = FALSE,yaxis=list(zerolinecolor=toRGB("red"))),
    combineWidgets(
      ncol = 1,
      # histograma de estocasticidad a lo largo de todo el tiempo
      plot_ly(res,x=~r,type="histogram") %>%
        layout(title="Tasa de Crecimiento"),
      # mapa logistico, muestra estados estacionarios en primer orden, de t-a a t
      plot_ly(mapa,x=~N_1,y=~N_0,type="scatter",mode="markers") %>%
        add_segments(x=0,xend=max(res[[2]]),y=0,yend=max(res[[2]])) %>%
        layout(title="Mapa Logistico", xaxis = list(title = "abundancia (t)"),
               yaxis = list(title="abundancia (t-1)"),showlegend = FALSE)
    )
    )
  },
  n0  = mwNumeric(100,  min =  2, step = 1    , label = "Poblacion Inicial"),
  t   = mwNumeric(100,  min =  2, step = 1    , label = "Generaciones (t)"),
  r   = mwNumeric(0.9,  min = -4, step = 0.05 , label = "Tasa de Crecimiento (r)"),
  K   = mwNumeric(60,   min = 5,  step = 2,     label = "Capacidad de Carga"),
  d   = mwNumeric(0.05, min =  0, step = 0.05 ,label = "Estocasticidad"),
  rango = mwSlider(0, t, c(1, t),label="Generaciones a Visualizar")
  )
}