Я написал функцию (не поделился кодом) с именем gg()
. У него есть 2 ggplots, наложенных друг на друга, так что у меня есть 2 оси y - одна справа, а другая слева. что-то вроде Это было передано из Как управлять координатами t, b, l, r gtable() для построения меток вторичной оси Y и поставьте галочки правильно
Последний объект, который печатается, относится к классу gtable, grob
, потому что для этого я использовал пакеты gtable
, grid
.
Теперь переходим к проблеме:
Я загрузил эту функцию в пакет, а в файле пространства имен я специально импортировал все функции из каждого пакета, например gtable
, grid
и т. д., и весь пакет ggplot2
. Теперь, после прикрепления этого пакета с помощью library()
, я вызываю функцию gg()
. Он создает пустой график в RStudio и даже в pdf, если использовать pdf()
и dev.off()
при первом вызове. Но если я вызову его снова, будут созданы графики.
Когда я вызываю одну и ту же функцию независимо, то есть не загружая пакет, а используя source()
для загрузки файла функции в одиночку, а затем вызывая gg()
, он строится даже в первый раз.
Мне нужна помощь относительно того, что все может быть причинами/причинами того же самого?
я). Были ли у кого-нибудь подобные проблемы с объектами gtable
?
Как вы думаете, какие могут быть разные возможности ошибок/ошибок. Я согласен с тем, что код должен быть доступен для лучшего понимания. Очень скоро я добавлю упрощенную версию функции вместе с другими необходимыми деталями.
Редактировать 1: - Добавление простой версии gg()
gg <- function(arg1, arg2, ...){
# let p1, p2 be a ggplot object(too big)
xx <- ggplot_build(p1)
yy <- ggplot_build(p2)
g1 <- ggplot_gtable(xx)
g2 <- ggplot_gtable(yy)
func1 <- function(grob){ # this function reverses the grobs
widths <- grob$widths
grob$widths[1] <- widths[3]
grob$widths[3] <- widths[1]
grob$vp[[1]]$layout$widths[1] <- widths[3]
grob$vp[[1]]$layout$widths[3] <- widths[1]
grob$children[[1]]$hjust <- 1 - grob$children[[1]]$hjust
grob$children[[1]]$vjust <- 1 - grob$children[[1]]$vjust
grob$children[[1]]$x <- unit(1, "npc") - grob$children[[1]]$x
return(grob)
}
pp <- c(subset(g1$layout, grepl("panel", g1$layout$name), se = t:r))
g <- gtable_add_grob(g1, g2$grobs[grepl("panel", g1$layout$name)],
pp$t, pp$l, pp$b, pp$l, name = "2ndpanel - ")
# inserts the 2nd y-axis label
index <- which(g2$layout$name == "ylab")
ylab <- g2$grobs[[index]]
ylab <- func1(ylab)
ylab$children[[1]]$rot <- ylab$children[[1]]$rot + 180
g <- gtable_add_cols(g, g2$widths[g2$layout[index, ]$l], pos = max(pp$r))
g <- gtable_add_grob(g,ylab, t = min(pp$t), l = max(pp$r)+1,
b = max(pp$b), r = max(pp$r)+1,
clip = "off", name = "2ndylab")
grid.draw(g)
if (newpage)
grid.newpage() # incase you want to have multiple pages of a pdf
Я объясню аргумент «newpage» в предпоследней строке кода. Это аргумент, передаваемый пользователем, сообщающий, что я хочу создать еще одну страницу графика в том же pdf, которая открывается с помощью pdf() и будет закрыта после последнего графика с помощью dev.off(). В последнем сюжете пользователь передаст newpage = FALSE
print
- person IRTFM   schedule 19.09.2016