Ich versuche, iterativ alle möglichen Plots meiner Daten zu erstellen, farbig von jeder Spalte in einer Tabelle.Wie man Schließungen in R bekämpft?
Bisher habe ich diesen Code:
# ----- next is a function taken from http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/
# --- not relevant to the question, my code is in the end of the snippet
library(ggplot2)
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
library(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# If layout is NULL, then use 'cols' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
#----------------------------------------------------------------
temp23_before6 <- data.frame(TIME = c(1, 2, 3, 4, 5),
VALUE = c(1, 2, 3, 4, 5),
P = c(1, 2, 3, 2, 1),
D = c(4, 5, 6, 7, 8))
i <- 1
p <- list()
for (col in names(temp23_before6)) {
l <-length(unique(temp23_before6[, col]))
if (l < 20 && l > 1) {
cc <- col
p[[i]] <- ggplot(temp23_before6, aes(TIME, VALUE, colour=factor(temp23_before6[, cc]))) +
geom_point() + labs(title=col)
i <- i + 1
}
}
multiplot(plotlist = p, cols = as.integer(sqrt(i)))
Leider ist cc
nicht wegen Schließung geändert, und ich erhalten alle Parzellen genau das gleiche. Der übliche Trick, der mit anderen Sprachen funktioniert - Zuweisung col
an eine lokale Variable - funktioniert nicht. Wie kann ich es in R arbeiten lassen?
Aktualisierung Aktualisierter Code, damit das Beispiel in einem neuen R env ausgeführt werden kann. Ich erwarte, dass diese vier Plots eine andere Farbe haben. Die beiden Time
und Value
sollte offensichtlich einfarbiger sein, und die anderen beiden P
und D
sollten unterschiedliche Farben haben, von P = c(1, 2, 3, 2, 1), D = c(4, 5, 6, 7, 8)
bestimmt, so sollte D
5 verschiedene Farben haben, und P
sollte nur 3
'c' ist ein Objekt, existiert bereits in R und sollte nicht überschrieben werden. Da Sie eine 'for'-Schleife schreiben, gibt es keinen Unterschied zwischen" lokalen "und" globalen "Variablen, da Sie keinen anderen Bereich angeben. Ich verstehe nicht, warum Sie überhaupt 'col' zu' c' zuweisen müssen, da es nur einmal aufgerufen wird und nur mit 'col' aufgerufen werden kann. Funktioniert Ihr Code, wenn Sie 'color = factor (temp23_before6 [, c])' durch 'color = factor (temp23_before6 [, col])' 'ersetzen? – brittenb
@Batanichek Total verpasst. Aber das hilft leider nicht – Archeg
@brittenb Nein, wenn ich es mit "col" ersetze macht es immer noch dasselbe.Der übliche Trick in anderen Sprachen (C#, Java) besteht darin, eine lokale Variable für eine Closure zu erstellen, also wird für jede Variable eine separate lokale Variable verwendet (also haben Sie die gleiche Anzahl an lokalen Variablen wie dort in der Array-Summe). so schließt jeder für den Lauf getrennt über seine eigene 'c' -Instanz). Aber anscheinend funktioniert das nicht in R – Archeg