2009-10-03 3 views
2

Я хотел бы написать функцию, которая принимает имя файла и создает файл .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)) 
} 

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

Ошибка в ВНС [тест & NAS!] < - Rep (да, length.out = длина (ANS)) [тест &: замена имеет длину

любые идеи? Я чувствую, что я что-то пропускаю.

+0

ой также первый ifelse работает, это второй, где произошла ошибка – Dan

ответ

2

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

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

«IfElse» возвращает значение с той же формы, как «тест», который заполнена элементами, выбранными из «да» или «нет» в зависимости от того, является ли элемент «test» «TRUE» или «FALSE».

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

if (.Platform$OS.type == "unix") { 
    pdf(name, width=6, height=4) 
} else { 
    wmf(name, width=6, height=4) 
} 
+0

Я знал, что я обозревал, спасибо много – Dan

5

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

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

->

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) 
} 
+0

Я не думаю, что это сработает. В моей установке Windows работает match.fun ("pdf"), но match.fun ("wmf") терпит неудачу. Где функция wmf()? Это не в grDevices ... – Harlan

+0

На самом деле это можно было бы назвать 'win.metafile' – hadley

+0

это win.metafile, я должен был отредактировать это, мой плохой – Dan

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