Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to parameterize a r package version?

I'm finding myself updating a the version and date of the r-packages that I maintain quite often. Both the version and date exists in DESCRIPTION, packageName-package.Rd and also man/packageName-package.Rd. I've forgotten to update in one file several times. These were originally generated by the package.skeleton command. Is there a similar command/utility script to update the version?

EDIT: Upon closer inspection the automatically generated versions and dates in the Rd files are not needed. The correct date and version still appears in the generated manual. So obviously this leave only one place to update this information.

like image 533
svenski Avatar asked Oct 23 '12 10:10

svenski


Video Answer


2 Answers

Paul Hiemstra's idea seemed very useful to me, so I wrote those few lines of codes:

upVers <- function(path,update="snapshot",date=TRUE,simplify=TRUE)
{
  # This function updates the description file from package
  # in path (assumed work directory by default, as typical
  # with projects in RStudio using GitHub).

  # Usage:
    # path: path to contents of a package
    # update: What to update? "version", "major", "minor", "snapshot"
    # date: Update date as well?
    # simplfy: omit trailing zeros?

  # Assumes following numbering system:
  # version.major.minor-snapshot

  uplist <- c("version","major","minor","snapshot")

  if (missing(path)) path <- getwd()
  DESCfile <- paste0(path,"/DESCRIPTION")
  if (!file.exists(DESCfile)) stop("DESCRIPTION does not exist. Is this the folder of a package?")

  DESC <- readLines(DESCfile)

  ### Update date:
  if (date)
  {
    DESC <- gsub("(?<=Date: )\\d{4}-\\d{2}-\\d{2}",Sys.Date(),DESC,perl=TRUE)
  }

  ### Update version:
  Vers <- regmatches(DESC,regexpr("(?<=Version: )\\d+\\.?\\d*\\.?\\d*\\-?\\d*",DESC,perl=TRUE))
  Vers <- as.numeric(unlist(strsplit(Vers,split="\\.|\\-")))
  Vers <- c(Vers,rep(0,length=4-length(Vers)))
  Vers[grep(update,uplist,ignore.case=TRUE)] <- Vers[grep(update,uplist,ignore.case=TRUE)] + 1
  Vers[1:4>grep(update,uplist,ignore.case=TRUE)] <- 0

  # Combine and replace:
  Vers <- paste(paste(Vers[1:3],collapse="."),Vers[4],sep="-")
  if (simplify)
  {
    Vers <- gsub("\\.?0?\\.?0?\\-?0?$","",Vers)
  }
  DESC <- gsub("(?<=Version: )\\d+\\.?\\d*\\.?\\d*\\-?\\d*",Vers,DESC,perl=TRUE)

  # Write Description:
  writeLines(DESC,DESCfile)
}

This function updates the DESCRIPTION file using a version numbering system version.major.minor-snapshot, by default the snapshot and date are updated. For example:

# An R package:
f <- function() "foo"
package.skeleton("Foo","f")

# Update:
upVers("Foo")

# DESCIRPTION now shows version number 1.0.0-1
like image 142
Sacha Epskamp Avatar answered Oct 07 '22 00:10

Sacha Epskamp


I'm not aware of such a tool, but you could leverage R functions like gsub, or external tools like grep and sed to program such behavior. This should not be more than a few lines of R.

like image 42
Paul Hiemstra Avatar answered Oct 07 '22 01:10

Paul Hiemstra