You can use gtable
to access the "empty cell" like so
library(gtable)
pg <- ggplotGrob(p)
qg <- ggplotGrob(q)
pl <- gtable_filter(pg, 'panel', trim=F)$layout
pg <- gtable_add_grob(pg, qg, t=max(pl$t), l=max(pl$l))
grid.newpage()
grid.draw(pg)
Edit: generic placement for n x m
facets