Объект ggplot+gtable дает пустые графики в первый раз при вызове, но позже успешно отображает графики

Я написал функцию (не поделился кодом) с именем 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


person joel.wilson    schedule 18.09.2016    source источник
comment
Возможно, это связано с порядком загрузки и с тем, что некоторые пакеты загружаются внутри функции, поэтому они вступают в силу только после первого раза. Попробуйте использовать ggplot::... и т. д. перед каждой функцией и проверьте, имеет ли это значение.   -  person Huub Hoofs    schedule 19.09.2016
comment
Похоже на еще один пример R-FAQ 7.22: cran.r-project.org/doc/FAQ/, в этом случае ответ будет print   -  person IRTFM    schedule 19.09.2016
comment
@ 42- поскольку это объект gtable, print() не работает. Он будет печатать детали сетки и координаты, а не график.   -  person joel.wilson    schedule 19.09.2016
comment
это обычная проблема с функциями сетки, которые запрашивают размеры: им нужно открытое устройство, что иногда приводит к нежелательным пустым страницам. По моему опыту, устройство Rstudio также немного более темпераментно, и некоторые сложные графики на основе сетки не всегда появляются с первого раза.   -  person baptiste    schedule 19.09.2016
comment
@baptiste спасибо, сэр. Даже на начальном этапе я думал, что это баг RStudio. однако, когда код R снова запускался через командную строку, те же проблемы сохранялись. Так запутался с причиной   -  person joel.wilson    schedule 19.09.2016
comment
@baptiste, когда вы говорите, что для объектов сетки требуется открытое устройство, есть ли у вас какие-либо средства для решения этой проблемы? Любые обходные пути?   -  person joel.wilson    schedule 19.09.2016
comment
Если вы можете создать минимальный воспроизводимый пример и опубликовать четкий отчет об ошибке, люди (gtable/rstudio/grid) могут изучить его.   -  person baptiste    schedule 19.09.2016
comment
@baptiste Я добавил уменьшенную версию кода. Пожалуйста, предлагайте свои взгляды   -  person joel.wilson    schedule 19.09.2016
comment
@Huub Hoofs - так что, если я добавлю package:: перед каждым вызовом, то в файле пространства имен мне придется использовать только import (), верно? а не importFrim(), который я использую в настоящее время для загрузки только определенных функций. Я проверил, что внутри этой функции нет загружаемых пакетов. и даже если бы они были, то как он мог генерировать графики, когда я звонил из-за пределов пакета?   -  person joel.wilson    schedule 20.09.2016