2014-06-20 2 views
2

Есть ли способ установить или замаскировать par() в локальной среде? Я не очень хорошо знаком с средами R, поэтому я не понимаю, почему это невозможно, хотя я определенно понимаю, почему это не поведение по умолчанию. Я видел this question, но я не знаю, достаточно ли знать, применимо ли оно здесь. Я также был бы удивлен, если не будет возможности изменить путь поиска, чтобы заставить его работать.Установить R графических параметров локально, но не глобально?

Опять же, нет способа настроить алгоритм, который решает, следует ли опускать некоторые метки вашей оси ... было бы так сложно просто переключиться, чтобы отключить эту функцию и позволить пользователям платить цену? Кажется, это была философия дизайна для всего остального на этом языке (и я как бы начинаю ее ценить).

+2

Вы можете передать любые параметры 'par' в функции' plot'. –

+2

Незначительное предупреждение о том, что @ SimonO'Hanlon сказал, есть несколько, перечисленных в начале '? Par', которые могут быть установлены только путем прямого вызова' par'. Но подавляющее большинство может быть обработано «заговором» напрямую. – joran

+0

@joran благодарит за нарушение. –

ответ

2

В дополнение к другим ответам и комментариям обратите внимание, что графические параметры являются локальными для графического устройства, поэтому вы можете открыть новое графическое устройство, установить нужные параметры, затем, когда вы закроете устройство (или вернетесь к другому), и будут действовать предыдущие параметры. Быстрый пример:

dev.new() 
par(col='blue') 
hist(rnorm(100)) 
abline(v=0, lwd=5) 
dev.new() 
par(col='red') 
hist(rnorm(1000)) 
par(lwd=5) 
abline(v=0) 
dev.off() 
plot(runif(25), rnorm(25)) 
abline(h=0, lwd=3) 

Смотрите помощь для dev.list и dev.set для получения подробной информации о переключении между графическими устройствами.

+0

Так что, если я просто использую 'windows()' все время (как и в любом случае), это не должно даже иметь значения? Или 'dev.new()' принципиально отличается от 'windows()'? Документы для одного ничего не говорят о другом. – shadowtalker

+0

Функция 'dev.new' - это кросс-платформенный способ открытия нового устройства.В Windows он вызывает функцию 'windows', но на других ОС она вызывает соответствующую функцию для этой ОС. Поэтому, если ваш код будет работать только в окнах, то функция 'windows' будет в порядке и сделает то же самое. –

6

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

function(...) { 
    old.pars <- par(...,no.readonly=TRUE) 
    on.exit(par(old.pars))) 
    ... 
} 

Я не 100% уверен, что эта идиома безопасно, если вы нарушите из функции в нестандартным образом (например, Ctrl- C, в то время как функция работает, или отладка/Q, а не обычная return())

Я столкнулся с несколькими функциями внутри пакетов, которые изменяют глобальные настройки par, не перезагружая их, что я считаю очень плохой практикой ...

+2

Я нашел, что неплохо дать пользователям возможность * не * восстанавливать параметры par, если они хотят использовать строки() или что-то добавить к сюжету, который вы только что создали. 'if (reset.par) on.exit (par (old.pars)))' – MrFlick

+0

Итак, не существует никакого способа маскировать 'par()'? Облом. Я предполагаю, что пришло время, вы начинаете писать функции вместо сценариев верхнего уровня ... – shadowtalker

+1

'on.exit()' на 100% безопасен. Но лучше привыкнуть использовать 'add = TRUE', иначе вы однажды перезапишете предыдущий' on.exit() 'и потратите часы, разрывая ваши волосы, пытаясь найти проблему. – hadley

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