2009-10-03 94 views
2

我想编写一个函数,它需要一个文件名并在* nix平台上生成.pdf文件,在Windows平台上生成该文件名和宽度为6英寸高度的.wmf 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 [测试& NAS!] < - 代表(是的,length.out =长度(ANS))[测试&: 替换长度为零

有什么想法?我觉得我正在俯视一些东西。

+0

哦也第一个ifelse的作品,这是错误发生的第二个 – Dan 2009-10-03 23:43:27

回答

2

我认为问题是,ifelse返回一个值,而不是做任何参数。我已经学会了这种困难的方式:ifelse!=速记,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 2009-10-04 00:00:08

5

这是你的功能稍微更精致的版本。改进:

  • 不惹你的工作目录
  • 避免了重复的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) 
} 
+0

我不认为这可行。在我的Windows安装中,match.fun(“pdf”)有效,但match.fun(“wmf”)失败。 wmf()函数在哪里?它不在grDevices ... – Harlan 2009-10-04 15:38:17

+0

其实,它可能被称为'win.metafile' – hadley 2009-10-05 22:14:27

+0

它是win.metafile,我应该编辑它,我的坏 – Dan 2009-11-10 23:36:27