Платформо-зависимое графическое устройство - PullRequest
2 голосов
/ 04 октября 2009

Я хотел бы написать функцию, которая принимает имя файла и создает файл .pdf на платформе * nix и файл .wmf на платформе Windows с таким именем файла и шириной 6 дюймов высотой 4.

graph <- function(filename){
setwd("graphics")
ext <- ifelse(.Platform$OS.type == "unix", "pdf", "wmf")
name <- paste(filename, ext, sep=".")
ifelse(.Platform$OS.type == "unix", pdf(name, width=6, height=4), wmf(name, width=6, height=4))
}

Это моя попытка, но я получаю эту ошибку

Ошибка в ans [test &! Nas] <- rep (yes, length.out = length (ans)) [test &: замена имеет нулевую длину </p>

есть идеи? Я чувствую, что я что-то упускаю.

Ответы [ 2 ]

5 голосов
/ 04 октября 2009

Вот несколько более отлаженная версия вашей функции. Улучшения:

  • не связывается с вашим рабочим каталогом
  • позволяет избежать дублирования оператора if путем поиска функции устройства из расширения

->

graph <- function(filename) {
  ext <- if(.Platform$OS.type == "unix") "pdf" else "wmf"
  dev <- match.fun(ext)
  path <- paste("graphics/", filename, ".", ext, sep = "")

  dev(path, width = 6, height = 4)
}
2 голосов
/ 04 октября 2009

Мне кажется, проблема в том, что если ifelse возвращает значение, не делает все, что в аргументах. Я усвоил этот трудный путь раньше: ifelse! = Сокращение, если , ifelse = векторизация, если. Со страницы справки:

ifelse (тест, да, нет)

ifelse возвращает значение с тем же форма как «тест», который заполнены элементами, выбранными из «да» или «нет» в зависимости от того, является ли элемент 'test' ИСТИННЫМ или ЛОЖНЫМ.

Так что просто используйте что-то вроде:

if (.Platform$OS.type == "unix") {
  pdf(name, width=6, height=4) 
} else {
  wmf(name, width=6, height=4)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...