R: lapply и tibble не работают должным образом в двух циклах

#r #lapply #tibble

#r #lapply #tibble

Вопрос:

У меня есть набор кода, который перебирает все возможные сценарии, которые я использую для функции детализации в моем блестящем приложении. Однако Level_3_Drilldowns работает не так, как ожидалось, поскольку я не получаю свои определенные tibble имена.

Ниже приведен единственный вывод для Level_2_Drilldowns, который выдает то, что ожидается:

 [[3]]
[[3]]$id
[1] "ocean"

[[3]]$type
[1] "column"

[[3]]$data
[[3]]$data[[1]]
[[3]]$data[[1]]$name
[1] "Boat"

[[3]]$data[[1]]$y
[1] 2

[[3]]$data[[1]]$PerTotal
[1] 37

[[3]]$data[[1]]$drilldown
[1] "ocean_boat"
  

Здесь я вижу, что name , y и PerTotal определены (мне нужно иметь возможность ссылаться на них во всплывающей подсказке graph)

Ниже приведен единственный вывод для Level_3_Drilldowns, который не выдает ожидаемое:

 [[5]]
[[5]]$id
[1] "ocean_boat"

[[5]]$type
[1] "column"

[[5]]$data
[[5]]$data[[1]]
[[5]]$data[[1]][[1]]
[1] "Fig"

[[5]]$data[[1]][[2]]
[1] 1

[[5]]$data[[1]][[3]]
[1] 37


[[5]]$data[[2]]
[[5]]$data[[2]][[1]]
[1] "Tony"

[[5]]$data[[2]][[2]]
[1] 1

[[5]]$data[[2]][[3]]
[1] 37
  

Вы можете видеть, что name , y и PerTotal не определены.

Есть идеи о том, почему они не отображаются?

Ниже приведен полный код:

 library (tidyr)
library (data.table)
library (highcharter)

x <- c("Farm","Farm","Farm","City","City","City","Ocean","Ocean")
y <- c("Sheep","Sheep","Cow","Car","Bus","Bus","Boat","Boat")
z <- c("Bill","Tracy","Sandy","Bob","Carl","Newt","Fig","Tony")
a <- c(1,1,1,1,1,1,1,1)
b <- c(3,5,1,3,8,5,3,9)

dat <- data.frame(x,y,z,a)


#First Tier #Copied
datSum <- dat %>%
  group_by(x) %>%
  summarize(Quantity = sum(a)
  )
datSum <- arrange(datSum,desc(Quantity))
Lvl1dfStatus <- tibble(name = datSum$x, y = datSum$Quantity, drilldown = tolower(name))


Level_2_Drilldowns <- lapply(unique(dat$x), function(x_level) {
  # x_level is what you called 'input' earlier.
  datSum2 <- dat[dat$x == x_level,]

  datSum2 <- datSum2 %>%
    group_by(y) %>%
    summarize(Quantity = sum(a),
              PerTotal = sum(b)
    )
  datSum2 <- arrange(datSum2,desc(Quantity))

  Lvl2dfStatus <- tibble(name = datSum2$y,y = datSum2$Quantity, PerTotal = datSum2$PerTotal, drilldown = tolower(paste(x_level, name, sep = "_")))

  list(id = tolower(x_level), type = "column", data = list_parse(Lvl2dfStatus))
})

Level_3_Drilldowns <- lapply(unique(dat$x), function(x_level) {

  datSum2 <- dat[dat$x == x_level,]

  lapply(unique(datSum2$y), function(y_level) {

    datSum3 <- datSum2[datSum2$y == y_level,]

    datSum3 <- datSum3 %>%
      group_by(z) %>%
      summarize(Quantity = sum(a),
                PerTotal = sum(b)
      )
    datSum3 <- arrange(datSum3,desc(Quantity))

    Lvl3dfStatus <- tibble(name = datSum3$z,y = datSum3$Quantity, PerTotal = datSum3$PerTotal)

    list(id = tolower(paste(x_level, y_level, sep = "_")), type = "column", data = list_parse2(Lvl3dfStatus))
  })
}) %>% unlist(recursive = FALSE)
  

Комментарии:

1. что list_parse2() ?

2. то же самое, что и list_parse() , создает список из data.table, но удаляет name связанные с ним данные. Я использую это в функции детализации, чтобы пользователи знали, что они больше не могут выполнять детализацию (в Shiny это будет отображаться синим подчеркиванием для возможности детализации)

3. Я пытался воспроизвести вашу проблему и получил ошибку в этой функции… возможно, вы захотите включить код для этого или удалить его из своего примера кода, чтобы упростить его.

4. Когда я удаляю последний list вызов, список Level_3_Drilldowns, который я получаю, идентифицирует name, y и perTotal во всех элементах. Я предполагаю, что это означает, что проблема в этом последнем вызове, но я не могу запустить его без кода для list_parse2() .

5. Но вы правы, изменение list_parse2() на list_parse() работает