R: манипулировать именем списка - PullRequest
0 голосов
/ 06 марта 2020

Вот мой минимальный воспроизводимый пример:

temp = list()
temp$rows$`1`$rows$name <- "rows"
temp$rows$`1`$rows$`1`$cells$name <- "cells"
temp$rows$`2`$rows$name <- "rows"
temp$rows$`2`$rows$`2`$cells$name <- "cells"

Токовый выход:

$rows
$rows$`1`
$rows$`1`$rows
$rows$`1`$rows$name
[1] "rows"

$rows$`1`$rows$`1`
$rows$`1`$rows$`1`$cells
$rows$`1`$rows$`1`$cells$name
[1] "cells"





$rows$`2`
$rows$`2`$rows
$rows$`2`$rows$name
[1] "rows"

$rows$`2`$rows$`2`
$rows$`2`$rows$`2`$cells
$rows$`2`$rows$`2`$cells$name
[1] "cells"

Интересно, есть ли программный c способ заменить $1 на [[1]] и $2 до [[2]] в этом списке? Поэтому сделайте вывод похожим на это, потому что это важный шаг для создания массивов при преобразовании списка в JSON.

$rows
$rows[[1]]
$rows[[1]]$rows
$rows[[1]]$rows$name
[1] "rows"

$rows[[1]]$rows[[1]]
$rows[[1]]$rows[[1]]$cells
$rows[[1]]$rows[[1]]$cells$name
[1] "cells"





$rows[[2]]
$rows[[2]]$rows
$rows[[2]]$rows$name
[1] "rows"

$rows[[2]]$rows[[2]]
$rows[[2]]$rows[[2]]$cells
$rows[[2]]$rows[[2]]$cells$name
[1] "cells"

Вот то, что я пытался, но не работал правильно: lapply(temp$rows$ 1 , unname)

Спасибо!

1 Ответ

1 голос
/ 07 марта 2020

Это то, что вы хотите, я думаю?

Сначала есть функция, которая переименовывает любые элементы списка с именами "1" или "2" в пустые строки.

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

fixnames <- function(x){
  names(x)[names(x)==1] <- ""
  names(x)[names(x)==2] <- ""
  x
  }

rename <- function(x) {
    if(is.list(x)) lapply(fixnames(x), rename) else x
    }


> rename(temp)
$rows
$rows[[1]]
$rows[[1]]$rows
$rows[[1]]$rows$name
[1] "rows"

$rows[[1]]$rows[[2]]
$rows[[1]]$rows[[2]]$cells
$rows[[1]]$rows[[2]]$cells$name
[1] "cells"





$rows[[2]]
$rows[[2]]$rows
$rows[[2]]$rows$name
[1] "rows"

$rows[[2]]$rows[[2]]
$rows[[2]]$rows[[2]]$cells
$rows[[2]]$rows[[2]]$cells$name
[1] "cells"






...