【问题标题】:Platform-specific graphic device特定平台的图形设备
【发布时间】:2010-12-03 15:53:57
【问题描述】:

我想编写一个函数,它接受一个文件名并在 *nix 平台上生成一个 .pdf 文件,并在 Windows 平台上生成一个 .wmf 文件名,该文件名和宽度为 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] 中的错误

有什么想法吗?我觉得我忽略了一些东西。

【问题讨论】:

  • 哦,第一个 ifelse 也有效,这是第二个发生错误的地方

标签: r


【解决方案1】:

这是您的函数的一个更完善的版本。改进:

  • 不会弄乱您的工作目录
  • 通过从扩展中查找设备函数来避免重复的 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)
}

【讨论】:

  • 我认为这行不通。在我的 Windows 安装中,match.fun("pdf") 有效,但 match.fun("wmf") 失败。 wmf() 函数在哪里?它不在 grDevices 中...
【解决方案2】:

我认为问题在于 ifelse 返回一个值,执行参数中的任何操作。我以前学过这个很难:ifelse != shorthand if, ifelse = vectorized if。从帮助页面:

ifelse(测试,是,否)

'ifelse' 返回一个相同的值 形状为“测试”,即 填充从“是”或“否”中选择的元素,具体取决于 关于'test'的元素是'TRUE'还是'FALSE'。

所以只需使用类似的东西:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多