Вопрос

Я начал использовать Sweave некоторое время назад. Однако, как и большинство людей, я встречал довольно скоро главную проблему: скорость. Гравки Большой документ занимает века для бега, что делает эффективные работы вполне сложным. Обработка данных может быть очень ускорена с CacheSweave. Однако сюжеты - особенно GGPlot;) - все еще занимают слишком много времени, чтобы сделать. Вот так я хочу использовать PGFSweave.

После многих часов я наконец-то удался создать рабочую систему с Eclipse / StateT / Texlipse. Затем я хотел преобразовать существующий отчет для использования с PGFSWeave и имел плохой сюрприз: большинство моих GGPLOTS, похоже, больше не работают. Следующий сюжет, например, отлично работает в консоли и Sweave:

pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)

Запуск его с PGFSWEAVE, однако, я получаю эту ошибку:

Error in if (width > 0) { : missing value where TRUE/FALSE needed
In addition: Warning message:
In if (width > 0) { :
  the condition has length > 1 and only the first element will be used
Error in driver$runcode(drobj, chunk, chunkopts) : 
  Error in if (width > 0) { : missing value where TRUE/FALSE needed

Когда я удаляю AES (...) от Geom_Point, сюжет отлично работает с PGFSWEAVE.

pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)

Редактировать: Я больше исследовал проблему и может снизить проблему к устройству Tikz.

Это работает просто хорошо:

quartz()
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)

Это дает вышеуказанную ошибку:

tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
dev.off()

Это работает просто хорошо:

tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)
dev.off()

Я мог бы повторить это с 5 различными GGPlots. Когда не используя цвет (или размер, альфа, ...) в сопоставлении, он работает с Tikz.

Q1: У кого-нибудь есть какие-то объяснения для этого поведения?

Кроме того, кэширование кусков не сюжетных кодов не очень хорошо работает. Следующий кусок кода не занимает времени вообще с Sweave. С PGFSweaveve требуется примерно 10 сек.

<<plot.opts,echo=FALSE,results=hide,cache=TRUE>>=
#colour and plot options are globally set
pal1 <- brewer.pal(8,"Set1")
pal_seq <- brewer.pal(8,"YlOrRd")
pal_seq <- c("steelblue1","tomato2")
opt1 <- opts(panel.grid.major = theme_line(colour = "white"),panel.grid.minor = theme_line(colour = "white"))
sca_fill_cont_opt <- scale_fill_continuous(low="steelblue1", high="tomato2")
ory <- geom_hline(yintercept=0,alpha=0.4,linetype=2) 
orx <- geom_vline(xintercept=0,alpha=0.4,linetype=2)
ts1 <- 2.3
ts2 <- 2.5
ts3 <- 2.8
ps1 <- 6
offset_x <- function(x,y) 0.15*x/pmax(abs(x),abs(y))
offset_y <- function(x,y) 0.05*y/pmax(abs(x),abs(y))
plot_size <- 50*50

Это кажется довольно странным поведением, так как только некоторые переменные установлены для последующего использования.

Q2: У кого-нибудь есть какие-то объяснения для этого?

Q3: В целом, я хотел бы спросить, если кто-нибудь вообще использует PGFWAEVE? С успешно я имею в виду, что все вещи, которые работают в SWEAVE, также работают в PGFSCEAVE, с дополнительным преимуществом хороших шрифтов и улучшенной скорости. ;)

Большое спасибо за ответы!

Это было полезно?

Решение

Q1: У кого-нибудь есть какие-то объяснения для этого поведения?

Это три причины, позади того, почему Tikzdevice дает ошибку при попытке построить свой участок:

  • Когда вы добавляете эстетическое отображение, которое создает легенду, например, aes(colour=que_id), GGPLOT2 будет использовать имя переменной как название легенды --- в этом случае Que_id.

  • Тикздевице проходит все строки, такие как заголовки легенды, латекс для набора набора.

  • В латексе подчеркивающий персонаж, _, используется для обозначения индекса. Если подчеркивание используется вне математического режима, он вызывает ошибку.

Когда Tikzdevice пытается рассчитать высоту и ширину заголовка легенды, «Que_id», она передает строку в латекс для набора набора и ожидает латекс для возврата ширины и высоты строки. Латекс терпит ошибку, потому что в строке из MathMode используется необоснованная подчеркивание. Тикздевице получает NULL для ширины строки вместо номера, который вызывает if (width > 0) Проверьте неудачу.

Способы избежать проблемы

  1. Укажите заголовок легенды для использования, добавив цветную масштаб:

    p1 <- ggplot(plot_info, aes(elevation, area))
    p1 <- p1 + geom_point(aes(colour=que_id))
    
    
    # Add a name that is easier for humans to read than the variable name
    p1 <- p1 + scale_colour_brewer(name="Que ID")
    
    
    # Or, replace the underscore with the appropriate LaTeX escape sequence
    p1 <- p1 + scale_colour_brewer(name="que\\textunderscore id")
    
  2. Используйте функцию Sning Sanitization, введенную в Tikzdevice 0.5.0 (но был сломан до 0,5,2). В настоящее время Sning Sanitization будет сбежать только в следующих персонажах: %, $, {, }, а также ^ по умолчанию. Тем не менее, вы можете указать дополнительные пары замены через tikzSanitizeCharacters а также tikzReplacementCharacters опции:

    # Add underscores to the sanitization list
    options(tikzSanitizeCharacters = c('%','$','}','{','^', '_'))
    options(tikzReplacementCharacters = c('\\%','\\$','\\}','\\{',
      '\\^{}', '\\textunderscore'))
    
    
    # Turn on string sanitization when starting the plotting device
    tikz('myPlot.tex', standAlone = TRUE, sanitize = TRUE)
    print(p1)
    dev.off()
    

Мы будем публиковать версию 0.5.3 Тикздевице в ближайшие пару недель, чтобы решить некоторые раздражающие предупреждающие сообщения, которые теперь появляются из-за изменений в способе ручек R system(). Отказ Я добавлю следующие изменения в эту следующую версию:

  • Лучшее предупреждающее сообщение, когда width является NULL Указывает на то, что есть, вероятно, что-то не так с текстом сюжета.

  • Добавьте подчеркивание и несколько других символов набор символов по умолчанию, для которых Sning Siditizer ищет.

Надеюсь это поможет!

Другие советы

Q2: Я являюсь сопровождающим PGFWEAVE.

Вот результаты теста, который я побежал:

time R CMD Sweave time-test.Rnw 

real    0m1.133s
user    0m1.068s
sys     0m0.054s

time R CMD pgfsweave time-test.Rnw 

real    0m2.941s
user    0m2.413s
sys     0m0.364s

time R CMD pgfsweave time-test.Rnw 

real    0m2.457s
user    0m2.112s
sys     0m0.283s

Я считаю, что есть 2 причины разницы во времени, но потребуется больше работы, чтобы их точно проверить:

  • PGFWEAVEVE делает тонну проверки и двойной проверки, чтобы убедиться, что она не повторяла дорогие вычисления. Цель состоит в том, чтобы сделать это возможным делать более дорогих расчетов и построения в документ. Шкала «дорогостоящего» в этом случае намного больше, чем дополнительные секунды или два, чтобы проверить проверки.

В качестве примера кэширования рассмотрите следующий тестовый файл, чтобы увидеть реальные преимущества кэширования:

\documentclass{article}

\begin{document}

<<plot.opts,cache=TRUE>>=
x <- Sys.sleep(10)
@

\end{document}

И результаты:

time R CMD Sweave time-test2.Rnw 

real    0m10.334s
user    0m0.283s
sys     0m0.047s

time R CMD pgfsweave time-test2.Rnw 

real    0m12.032s
user    0m1.356s
sys     0m0.349s

time R CMD pgfsweave time-test2.Rnw 

real    0m1.423s
user    0m1.121s
sys     0m0.266s
  • Sweave претерпела некоторые изменения в R 2.12. Изменения, возможно, ускорили процесс оценки кусочки кода и покинули PGFWeave позади для этих меньших расчетов. Стоит заглянуть внутрь

Q3: Я все время использую PGFSweaveve для моей собственной работы. В R 2.12 были некоторые изменения в Sweave в R 2.12, которые вызывают некоторые незначительные проблемы с PGFsweave, но новая версия наступает, которая исправляет все. Версия для разработки на GitHub ( https://github.com/cameronbracken/pgfsweave.) уже есть изменения. Если у вас есть дополнительные проблемы, я был бы рад помочь.

Q2: вы используете \pgfrealjobname{<DOCUMENTNAME>} В заголовке и варианте external=TRUE Для графических кусков? Я обнаружил, что это значительно увеличивает скорость (не для первой компиляции, но для последующих, если графика не изменяется). Вы найдете больше фона в Vignette PGFsweave.

Q3: Для меня все работает нормально, я использую Windows + Eclipse / StateT / Texlipse, как вы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top