Существует интересный поток на Лямбда Окончательное , который обсуждает LALR-грамматика для C++ .
Это включает ссылку на диссертация , который включает обсуждение парсинга C++, который указывает что:
"грамматика C++ неоднозначна, контекстно-зависима и потенциально требует, чтобы бесконечное предвидение разрешило некоторые неоднозначности".
Это продолжает давать много примеров (см. страницу 147 PDF).
пример:
int(x), y, *const z;
значение
int x;
int y;
int *const z;
Выдерживают сравнение с:
int(x), y, new int;
значение
(int(x)), (y), (new int));
(разделенное от запятой выражение).
две маркерных последовательности имеют ту же начальную подпоследовательность, но различные деревья синтаксического анализа, которые зависят от последнего элемента. Перед снимающим неоднозначность может быть произвольно много маркеров.
Да, мне кажется, вам нужно правильно организовать свои данные. Один из способов был бы следующим:
X <- data.frame(x=rep(x,2),
y=c(3*x+eps, 2*x+eps),
case=rep(c("first","second"), each=100))
qplot(x, y, data=X, facets = . ~ case) + geom_smooth()
Я уверен, что есть лучшие приемы в plyr или reshape - я все еще не совсем в курсе на всех этих мощных пакетах Хэдли.
Используя пакет reshape, вы можете сделать что-то вроде этого .
library(ggplot2)
wide <- data.frame(x = rnorm(100), eps = rnorm(100, 0, .2))
wide$first <- with(wide, 3 * x + eps)
wide$second <- with(wide, 2 * x + eps)
long <- melt(wide, id.vars = c("x", "eps"))
ggplot(long, aes(x = x, y = value)) + geom_smooth() + geom_point() + facet_grid(.~ variable)
Обновление: Этот ответ очень старый. gridExtra :: grid.arrange ()
- теперь рекомендуемый подход.
Я оставляю его здесь на случай, если он может быть полезен.
Стивен Тернер разместил функцию организовать ()
в блоге Getting Genetics Done (инструкции по применению см. В сообщении)
vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)
arrange <- function(..., nrow=NULL, ncol=NULL, as.table=FALSE) {
dots <- list(...)
n <- length(dots)
if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)}
if(is.null(nrow)) { nrow = ceiling(n/ncol)}
if(is.null(ncol)) { ncol = ceiling(n/nrow)}
## NOTE see n2mfrow in grDevices for possible alternative
grid.newpage()
pushViewport(viewport(layout=grid.layout(nrow,ncol) ) )
ii.p <- 1
for(ii.row in seq(1, nrow)){
ii.table.row <- ii.row
if(as.table) {ii.table.row <- nrow - ii.table.row + 1}
for(ii.col in seq(1, ncol)){
ii.table <- ii.p
if(ii.p > n) break
print(dots[[ii.table]], vp=vp.layout(ii.table.row, ii.col))
ii.p <- ii.p + 1
}
}
}