Имя функции псевдонима в .Rprofile, чтобы оно использовалось всеми сценариями R - PullRequest
1 голос
/ 17 марта 2020

В настоящее время я пытаюсь создать псевдоним функции R png с помощью CairoPNG для генерации png-файлов. Я пришел с точки зрения системного администратора на R - это значит, что я не написал ни один код R, и я не в состоянии изменить любой код R. Я запускаю его в конвейерах в среде elasti c HP C. Из-за особенностей среды мне пришлось бы устанавливать X11, cairo, et c на каждом исполняемом узле во время запуска (что добавляло бы 2-3 минуты произвольного времени к каждому заданию).

Я играл и установил пакет R Cairo, который может генерировать png без перенаправления X11, а это именно то, что мне нужно. Если я попытаюсь использовать png по умолчанию:

cars <- c(1,3,5)
png("cars.png")
Error in png("cars.png") : X11 is not available

Я понял, что могу обойти это, назначив CairoPNG на png в активном сеансе:

cars <- c(1,3,5)
png <- CairoPNG
png("cars.png")
plot(cars)

производит файл .png с именем cars.png. Поэтому я собираюсь сделать то же самое из .Rprofile, где каждый скрипт R, использующий png, на самом деле использует CairoPNG под капотом.

В моем .Rprofile я добавил:

require("Cairo")
png <- CairoPNG

Когда я запускаю новый интерактивный R-сеанс через командную строку, я вижу, что Cairo используется, но назначение png <- CairoPNG не работает:

Loading required package: Cairo
> png("cars.png")
Error in png("cars.png") : X11 is not available

Любая помощь был бы очень признателен!

1 Ответ

2 голосов
/ 17 марта 2020

Добавьте оператор message, чтобы при запуске R мы могли убедиться, что .Rprofile действительно работал. Также используйте library вместо require, потому что library выдаст ошибку прямо в этот момент, если произойдет сбой, упрощая отладку. Затем вместо помещения png в глобальную среду вставьте его в пространство имен grDevices. Для этого сначала его нужно разблокировать.

# This code goes in .Rprofile file
message("Hello")
library("Cairo")
unlockBinding("png", asNamespace("grDevices"))
utils::assignInNamespace("png", CairoPNG, "grDevices")

Для другого подхода проверьте:

Как запустить R на сервере без X11 и избежать нарушения зависимостей

...