Как удалить скобки индексации, когда функции возвращают несколько объектов? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь использовать функции, чтобы сократить количество строк кода, но мой вывод не такой чистый, как хотелось бы. В частности, при возврате нескольких элементов из функции (путем создания списка и использования return) R также выводит то, что я считаю индексирующими числами (например, [[1]][[1]][[1]]). Чтобы мой документ с уценкой был чище и читабельнее, я бы хотел удалить эти маленькие цифры.

Есть мысли, как это сделать? Осмотр ТАК меня никуда не привел. cat () здесь не работает, так как я пытаюсь вернуть график и таблицу.

Пример с использованием набора данных iris (с пакетами ggplot2, dplyr и kableExtra):

data(iris)

TypeLoop <- function(fun) {
  all <- fun(c("setosa","versicolor","virginica"),"All")
  set <- fun("setosa","Setosa")
  vers <- fun("versicolor","Versicolor")
  virg <- fun("virginica","Verginica")
  out <- list(all,set,vers,virg)
  return(out)
}

PlotNTable <- function(type,name) {
  myplot <- ggplot(iris,aes(Sepal.Length)) +
    geom_histogram(data=filter(iris, Species %in% type),color="white",fill="darkblue") +
    labs(x="Sepal Length", y="Frequency",
         title=paste(name,": Sepal Length"))

  sep.table <- iris %>%
    filter(Species %in% type) %>%
    group_by(Sepal.Length) %>%
    summarize("Less than 6" = sum(Sepal.Length<6),
                "6 to 7" = sum(Sepal.Length<7 & Sepal.Length>=6),
                "More than 7" = sum(Sepal.Length>7))
  mytable <- kable(sep.table, caption = paste(name,": Sepal Length")) %>%
    kable_styling(c("striped","bordered","hover")) %>%
    column_spec(1, bold = T) 

  #Make the function return both objects
  out <- list(myplot,mytable)
  return(out)
}

#Return the plots and tables
TypeLoop(PlotNTable)

Я включил опцию results='asis' в верхнюю часть фрагмента кода, чтобы он действительно связал документ уценки.

Кроме того, я новичок в R, поэтому, если вы видите красные флажки / избыточности / дайте мне знать, как лучше делать то, что я пытаюсь делать в этом коде!

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Используя ваш код, я думаю, это даст желаемый эффект. Используйте flatten(), чтобы удалить иерархию списка, и walk(), чтобы выполнить итерацию и распечатать результаты только для их побочных эффектов.

library(purrr)

#Return the plots and tables
x <- TypeLoop(PlotNTable)

walk(flatten(x), print)
0 голосов
/ 06 мая 2020

Использование c вместо list должно немного облегчить боль.

TypeLoop <- function(fun) {
  all <- fun(c("setosa","versicolor","virginica"),"All")
  set <- fun("setosa","Setosa")
  vers <- fun("versicolor","Versicolor")
  virg <- fun("virginica","Verginica")
  return( c(all, set, vers, virg) )
}

Остальное я не могу сказать с уверенностью, потому что я не пробовал это в среде вязальщика. Но следующее, что я хотел бы попробовать, это что-то вроде этого. В консоли вроде работает. Вы сможете понять это отсюда.

output <- function(x) {
  if ("gg" %in% class(x)) { 
    print(x)
  } else if ("knitr_kable" %in% class(x)) {
    cat(unlist(x), "\n")
  }
}
sapply(TypeLoop(PlotNTable), output)

Это то, что вы искали?

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