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)