Как добавить пунктирные линии между элементами списка? - PullRequest
4 голосов
/ 20 мая 2019

У меня есть такой список:

x <- 1
y <- 2
z <- "something"
my_list <- list("x" = x, "y" = y, "z" = z)
> my_list
$x
[1] 1
$y
[1] 2
$z
"something"

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

$x
[1] 1
-------------------------------------
$y
[1] 2
-------------------------------------
$z
[1] "something"
-------------------------------------

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

Нечто подобное может сработать.

mylistprint <- function(x){

    nn <- names(x)
    ll <- length(x)
    if (length(nn) != ll) {
      nn <- paste("Component", seq.int(ll))
      }
    for (i in seq_len(ll)) {
      cat(nn[i], ":\n")
      print(x[[i]])
      cat("\n")
      cat(strrep("-", 25))
      cat("\n")
    }
    invisible(x)
}

mylistprint(my_list)

Вывод этого будет:

x :
[1] 1

-------------------------
y :
[1] 2

-------------------------
z :
[1] "something"

-------------------------
3 голосов
/ 20 мая 2019

Использование mapply
Вероятно, лучший способ сделать это - использовать mapply, или, по крайней мере, он намного короче.

fun1 <- function(x,y) cat(paste0('$', x), y,strrep("-", 25), sep = '\n')
x <- mapply(fun1, names(my_list), my_list)

Это печатает:

$x
1
-------------------------
$y
2
-------------------------
$z
something
-------------------------

Одна строка

x <- mapply(function(x,y) cat(paste0('$', x), y,strrep("-", 25), sep = '\n'), names(my_list), my_list)

Оберните его в функцию, если хотите

print.list <- function(list) {
  x <- mapply(function(x,y) cat(paste0('$', x), y,strrep("-", 25), sep = '\n'), names(list), list)
}
1 голос
/ 20 мая 2019

Из моих комментариев вы можете запустить цикл for, распечатав каждый элемент списка, затем напечатав "--------...-----", затем следующий элемент списка, поместив это в функцию, и все готово, например,

lsprint <- function(list){
  for (i in 1:length(list)){
    print(names(my_list)[i])
    print(my_list[[i]])
    print('--------------------')
  }

}
lsprint(my_list)

Возвращает,

[1] "x"
[1] 1
[1] "--------------------"
[1] "y"
[1] 2
[1] "--------------------"
[1] "z"
[1] "something"
[1] "--------------------"

Редактировать: Добавлено, чтобы вы получили имя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...