2009-10-03 9 views
2

Je voudrais écrire une fonction qui prend un nom de fichier et produit un fichier .pdf sur une plateforme * nix et un fichier .wmf sur une plate-forme Windows avec ce nom de fichier et une largeur de 6 pouces.Périphérique graphique spécifique à la plate-forme

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

C'est ma tentative, mais je reçois cette erreur

erreur dans [Test ans & nas!] < - représentant (oui, length.out = longueur (ans)) [Test &: le remplacement a la longueur zéro

des idées? J'ai l'impression de négliger quelque chose.

+0

oh aussi premier ifelse fonctionne, c'est la seconde où l'erreur s'est produite – Dan

Répondre

2

Je pense que le problème est que ifelse renvoie une valeur, pas faire tout ce qui est dans les arguments. J'ai appris cela à la dure: ifelse! = Raccourci si, ifelse = vectorisé si. De la page d'aide:

ifelse (test, oui, non)

« ifelse » retourne une valeur avec la même forme que « test » qui est rempli d'éléments choisis parmi soit « oui » ou 'non' selon si l'élément 'test' est 'VRAI' ou 'FAUX'.

Donc il suffit d'utiliser quelque chose comme:

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

je savais que je donnais sur, merci beaucoup – Dan

5

Voici une version un peu plus poli de votre fonction. Améliorations:

  • ne plaisante pas avec votre répertoire de travail
  • évite le double emploi si la déclaration en regardant la fonction de l'appareil de l'extension

->

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

Je ne pense pas que cela fonctionne. Sur mon installation Windows, match.fun ("pdf") fonctionne, mais match.fun ("wmf") échoue. Où est la fonction wmf()? Ce n'est pas dans grDevices ... – Harlan

+0

En fait, il pourrait s'appeler 'win.metafile' – hadley

+0

il est win.metafile, j'aurais dû éditer ça, mon mauvais – Dan

Questions connexes