From wdunlap at tibco.com  Mon Oct 18 21:03:20 2010
From: wdunlap at tibco.com (William Dunlap)
Date: Mon, 18 Oct 2010 12:03:20 -0700
Subject: [Rd] wishlist: system.file(..., mustExist = TRUE)
Message-ID: <77EB52C6DD32BA4D87471DCD70C8D700038B2146@NA-PA-VBE03.na.tibco.com>

I find system.file() handy for writing examples,
but if the user mistypes its arguments or if a
package is not up to date its return value of ""
can lead to trouble.  This forces the example to
be wordier than I'd like.

E.g., the following example works
  > scan(what="", sep="\n", system.file("DESCRIPTION"))
  Read 9 items
  [1] "Package: base"
  [2] "Version: 2.12.0"
  [3] "Priority: base"
  [4] "Title: The R Base Package"
  [5] "Author: R Development Core Team and contributors worldwide"
  [6] "Maintainer: R Core Team <R-core at r-project.org>"
  [7] "Description: Base R functions"
  [8] "License: Part of R 2.12.0"
  [9] "Built: R 2.12.0; ; 2010-10-18 15:08:12 UTC; unix"
but if you misspell DESCRIPTION you get
  > scan(what="", sep="\n", system.file("DESCRITION"))
  1:
and the user has to know how to get out of that scan() prompt.

I can write the example as
  theFile <- system.file("DESCRIPTION")
  if (!identical(theFile, ""))
      scan(what="", sep="\n", theFile)
  else
      stop("Cannot find file \"DESCRIPTION\" in package \"base\"")
but that would be pretty ugly in a help file.

What do you think of adding an argument mustExist=FALSE or
mustFind=FALSE to system.file() such that if it is TRUE and
no file is found then system.file throws an error?  Then my
example could be
  scan(what="", sep="\n", system.file("DESCRIPTION", mustExist=TRUE)) 
and it would throw an informative error message instead of
returning "" if DESCRIPTION were misspelled.

base::parseNamespaceFile uses an argument called mustExist
for this sort of thing and several functions in package:methods
(elNamed, getGeneric, etc.) use mustFind.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 



[Rd] wishlist: system.file(..., mustExist = TRUE)
William Dunlap