У меня есть функция, которая возвращает довольно большой объект определенного типа (сложная структура списка), который не имеет смысла отображать пользователю, потому что он загромождает экран.
returnsMuchStuff <- function() {
ret <- list(x=rnorm(170), y=rnorm(170))
class(ret) <- "MuchStuff"
return(ret)
}
Но у меня есть функция построения графика, которая может отображать содержимое в графике. Поэтому я хотел бы переопределить функциональность построения графиков так, чтобы график отображался непосредственно при возврате функций:
print.MuchStuff <- function(stuff) {plot(stuff$x, stuff$y)}
returnsMuchStuff() # displays plot - if plot can be displayed
Это работает нормально, если я, например, использую RStudio. Но я также хотел бы поддержать пользователей в командной строке, используя терминальный сервер, который не может напрямую просматривать график. В этом случае может оказаться, что по умолчанию выводится файл PDF.
Затем я хотел бы отобразить сообщение «PDF-файл / путь / к / файлу, созданному с помощью plot», потому что в противном случае для пользователя не очевидно, что здесь происходит.
Возможно ли это как-тоопределить, использует ли пользователь графический интерфейс или вывод будет отображен в файле? И если он отображается в файле, как я могу получить путь?
Единственное, что я нашел на этом пути, - это использование options("device")
. Но это выводит функцию, из которой я не могу извлечь эту информацию программно:
> options("device")
$device
function (file = if (onefile) "Rplots.pdf" else "Rplot%03d.pdf",
width, height, onefile, family, title, fonts, version, paper,
encoding, bg, fg, pointsize, pagecentre, colormodel, useDingbats,
useKerning, fillOddEven, compress)
{
initPSandPDFfonts()
new <- list()
....
}