2009-10-03 74 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