2013-05-16 5 views
3

Я пытаюсь добавить номера страниц в файл pdf, сгенерированный с использованием графика в R и сохраненный в формате pdf. Я использую d_pply в data.frame, в котором я использую команду plot.Добавление номеров страниц в pdf-файл, созданный R

Я думал, что d_pply поможет мне избежать цикла for. Ниже приведен образец из моих исходных данных со многими другими факторами.

data1 <- structure(list(fact = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L 
), .Label = c("A", "B", "C"), class = "factor"), speed = c(10.56, 
11.94, 13.61, 15, 16.67, 18.06, 19.44, 20.28, 21.11, 21.67, 22.5, 
23.06, 23.61, 24.44, 25, 25.56, 26.11, 26.94, 27.5, 15.83, 16.67, 
17.5, 18.06, 18.89, 19.72, 20.56, 21.11, 21.94, 22.5, 23.33, 
23.89, 24.44, 25, 25.56, 26.11, 26.67, 27.22, 8.61, 10.28, 11.94, 
13.61, 15, 16.39, 17.5, 18.89, 19.72, 20.83, 21.67, 22.22, 22.5, 
23.06, 23.61, 23.89, 23.89, 23.61)), .Names = c("fact", "speed" 
), class = "data.frame", row.names = c(NA, -55L)) 

Я пытался выполнить задачу с помощью глобального индекса. Но я ищу эффективный способ сделать это. This one не совсем мне помог.

index1 <<- 0 
plot_pg <- function(x) 
{ index1 <<- index1+1 
    plot(x$speed,main=paste0('pg# ',index1)) 
} 

genplot <- function(df1,filename1) 
{ 
    pdfNAME <- paste0(name1,'.pdf') 
    pdf(pdfNAME) 
    d_ply(df1,c('fact'),function(x) plot_pg(x)) 
    dev.off() 
} 
genplot(data1,'data1Plots') 

Update

Я должен упомянуть, что я бы разделив мой data.frame более чем одним variables..something как ddply(data,c('var1','var2'),function(x) MyplotFunc(x))

+0

Что случилось с циклом for? – joran

+0

Приведенные здесь примеры показывают только два фактора, но у меня на самом деле около 480 из них, и это может также увеличиться в будущем. Вы думаете, что цикл 'for' будет эффективным? Во всяком случае, как вы это сделаете, используя цикл 'for', не используя семейство функций 'apply'. –

ответ

4

Я бы просто сделать это:

genplot <- function(df1,filename1){ 
    pdfNAME <- paste0(filename1,'.pdf') 
    tmp <- split(df1,df1$fact) 
    pdf(pdfNAME) 
    for (i in seq_along(tmp)){ 
    plot(tmp[[i]][,'speed'],main = paste0("pg#",i)) 
    } 
    dev.off() 
} 

Идея, что петли for: по существу Медленный - это миф. Проблема заключается в том, что легко сместить в плохие методы кодирования внутри цикл for, который делает операции, которые вы делаете, занимает много времени.

В этом случае все, что вы делаете в цикле for, является построением графика, поэтому я сомневаюсь, что между этим будет большая разница в производительности и использование чего-то вроде lapply. Вещи, на которые нужно обратить внимание, - это растущие объекты (например, добавление) и модификация объектов, так как они приведут к чрезмерному копированию.

+0

Другая причина, по которой я использовал 'd_pply', заключалась в том, что мне пришлось разделить' data.frame' более чем на одну переменную. Но в этом случае я не мог бы «разделить». Любое предложение? –

+0

@ Stat-R Прочитайте документацию: «a» фактор в том смысле, что as.factor (f) определяет группировку или список таких факторов, и в этом случае их взаимодействие используется для группировки ». – joran

+0

'R' перешел в бесконечный цикл, когда я написал' tmp <- split (df1, as.list (df1 $ fact, df1 $ fac2)) ', где' fac2' - второй фактор. Ты знаешь почему? 'tmp <- split (df1, list (df1 $ fact, df1 $ fac2))' наконец-то работал ... –

Смежные вопросы