R: цикл, возвращающий список графиков, включает NULL - PullRequest
0 голосов
/ 14 июня 2019

У меня есть следующий код. Он выбирает данные и строит сюжет. Код перебирает переменную «критерий» и в конце цикла вставляет график в соответствующий индекс.

Все работает нормально, за исключением того, что все элементы, кроме последних, имеют нулевое значение и включен только последний график.

Как мне включить все графики в списке?

criteria <- c("A", "B", "C")


for(i in 1:length(criteria)){
    plotTbl <- dataTbl[Site == criteria[i]]
    plotTbl <- unique(plotTbl[ ,N := .N, by = .(Site, Var)])

    noexacCols <- unique(c(brewer.pal(name="Set1", n = 9),
                           brewer.pal(name="Set2", n = 8),
                           brewer.pal(name="BrBG", n =11),
                           brewer.pal(name="Paired", n = 12)))

    noexacCols <- noexacCols[i]

    colMapper <- data.table(Var = sort(unique(plotTbl[,Var])))
    colMapper[, colorCodes := noexacCols]
    plotTbl <- plotTbl[colMapper, on = .(Var), nomatch = 0]

    plotTbl[ ,Percent := round(100*N/sum(N), 1)]
    plotTbl[ ,text2display := paste0("Site = ",Site,
                                     "<br>",category, " = ", Var,
                                     "<br>N = ", N, " (", Percent, "%)")]


    f1 <- list(
      family = "Arial, sans-serif",
      size = 14,
      color = "black"
    )
    f2 <- list(
      family = "Arial, sans-serif",
      size = 12,
      color = "black"
    )

    a <- list(
      title = "",
      titlefont = f1,
      showticklabels = TRUE,
      tickangle = 0,
      tickfont = f2
    )

    b <- list(
      title = "",
      titlefont = f1,
      showticklabels = TRUE,
      tickangle = 0,
      tickfont = f2,
      zeroline = TRUE,
      showline = TRUE,
      mirror = FALSE,
      linecolor = toRGB("black"),
      linewidth = 1
    )

    p <- list()
    p[[i]] <- plot_ly(data = plotTbl ,
                      x = ~Var,
                      y = ~N,
                      type = 'bar',
                      marker = list(color = ~colorCodes),
                      opacity = 0.7,
                      hoverinfo="text",
                      text = ~text2display) %>%
      layout(xaxis = a, yaxis = b, showlegend = F, margin = list(b = 30))

  }

1 Ответ

1 голос
/ 14 июня 2019

Вы создаете p внутри цикла и перезаписываете его при каждом обороте. Переместить строку p <- list() перед циклом.

...