Обертывание функции графика R (или ggplot2) для предотвращения построения больших наборов данных - PullRequest
7 голосов
/ 15 октября 2011

Вместо того, чтобы спрашивать, как построить большие наборы данных, я хочу обернуть plot, чтобы код, который создает много графиков, не зависал при построении большого объекта.Как я могу обернуть plot очень простым способом, чтобы все его функции были сохранены, но сначала проверим, чтобы определить, является ли передаваемый объект слишком большим?

Этот код работает для очень ванильных вызововдо plot, но ему не хватает той же общности, что и plot (см. ниже).

myPlot <- function(x, ...){
    isBad <- any( (length(x) > 10^6) || (object.size(x) > 8*10^6) || (nrow(x) > 10^6) )
    if(is.na(isBad)){isBad = FALSE}
    if(isBad){
        stop("No plots for you!")
    }
    return(plot(x, ...))
}

x = rnorm(1000)
x = rnorm(10^6 + 1)

myPlot(x)

Пример, где это не получается:

x = rnorm(1000)
y = rnorm(1000)
plot(y ~ x)
myPlot(y ~ x)

Есть ли какой-нибудь простой способобернуть plot, чтобы включить эту проверку данных, которые будут нанесены, при этом все еще проходя через все аргументы?Если нет, то как насчет ggplot2?Я не заговорщик равных возможностей.(В тех случаях, когда набор данных большой, я буду использовать гексбин, подвыборку, графики плотности и т. Д., Но здесь это не главное.)


Примечание 1. При тестировании идей яРекомендуется проверять размер> 100 (или установить переменную, например, myThreshold <- 1000), а не размер> 1M - в противном случае при медленном построении будет много боли.:)

1 Ответ

6 голосов
/ 15 октября 2011

Ваша проблема в том, что в текущем коде myplot() предполагает, что x является объектом данных, но затем вы пытаетесь передать ему формулу. R plot() достигает этого с помощью методов - когда x является формулой, метод plot.formula() отправляется вместо базового plot.default() метода.

Вам нужно сделать то же самое:

myplot <- function(x, ...)
    UseMethod("myplot")

myplot.default <- function(x, ....) {
    isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) || 
                    (nrow(x) > 10^6))
    if(is.na(isBad)){isBad = FALSE}
    if(isBad){
        stop("No plots for you!")
    }
    invisible(plot(x, ...))
}

myplot.formula <- function(x, ...) {
    ## code here to process the formula into a data object for plotting
    ....
    myplot.default(processed_x, ...)
}

Вы можете украсть код из plot.formula() для использования в коде, необходимом для обработки x в объекте. Кроме того, вы можете сделать свой собственный ролик, следуя стандартным нестандартным правилам оценки (PDF) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...