R умно решает о пар-мфроу в функции

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

Это должно быть вроде:

  • 2 варя -> 1 на 2
  • 3 варианта -> 1 на 3
  • 4 варя -> 2 на 2
  • 5 переменных -> 2 на 3
  • 6 вариантов -> 2 на 3
  • .....
  • .....
  • 16 переменных -> 4 на 4
  • 16+ вариантов -> 4 на 4

Есть ли логическая формула для этого;

Как превратить это в успешное par(mfrow=(c(x,y)))?

Кроме того, как убедиться, что лимит номинала достигнут, чтобы click в следующем окне я не могу щелкнуть, когда у меня больше 16, но вместо этого просто перезаписывает предыдущие графики.

1 ответ

Решение

Получение количества строк и столбцов для устройства

n2mfrow() был разработан для этой цели, хотя он имеет тенденцию варьировать строки быстрее, чем столбцы, так что это противоположно тому, что вы хотите. Например:

> n2mfrow(2)
[1] 2 1

указывает 2 строки на 1 столбец. Конечно, rev() позволяет легко получить желаемый результат:

> rev(n2mfrow(3))
[1] 1 3

Вот выход из n2mfrow() для 2–16 общих участков с изменяющимися столбцами быстрее:

t(sapply(2:16, function(x) rev(n2mfrow(x))))

> t(sapply(2:16, function(x) rev(n2mfrow(x))))
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    2    2
 [4,]    2    3
 [5,]    2    3
 [6,]    3    3
 [7,]    3    3
 [8,]    3    3
 [9,]    3    4
[10,]    3    4
[11,]    3    4
[12,]    4    4
[13,]    4    4
[14,]    4    4
[15,]    4    4

Сделать это интерактивным

Для бита "нажмите после 16". Если вы делаете заговор в for(i in numplots) цикл, когда i > 16 звонков devAskNewPage(ask = TRUE) и это предложит пользователю активировать следующий сюжет.

Например:

np <- 18 ## number of plots
rc <- ifelse(np > 16, 16, np)
op <- par(mfrow = rev(n2mfrow(rc)))
for(i in seq_len(np)) {
  if(i == 2) {
    devAskNewPage(ask = TRUE)
  }
  plot(1:10)
}
par(op)
devAskNewPage(ask = FALSE)

Подобную вещь можно сделать, используя locator(1) заставить клик перейти на пост 16 сюжетов, но для этого нужно немного больше работы:

np <- 18 ## number of plots
rc <- ifelse(np > 16, 16, np)
op <- par(mfrow = rev(n2mfrow(rc)))
for(i in seq_len(np)) {
  if((i %% 16) + 1 == 2 && i > 1) {
    message("Page filled. Click on device to continue...")
    locator(1)
  }
  plot(1:10)
}
par(op)
Другие вопросы по тегам