Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以参数化r包版本?_R_Automation_Versioning_Packages - Fatal编程技术网

是否可以参数化r包版本?

是否可以参数化r包版本?,r,automation,versioning,packages,R,Automation,Versioning,Packages,我发现自己正在更新我经常维护的r包的版本和日期。版本和日期均存在于说明中,packageName-package.Rd和man/packageName-package.Rd。我好几次忘记更新一个文件。它们最初是由package.skeleton命令生成的。是否有类似的命令/实用程序脚本来更新版本 编辑:仔细检查后,不需要Rd文件中自动生成的版本和日期。生成的手册中仍会显示正确的日期和版本。显然,这只留下一个地方来更新这些信息。我不知道有这样的工具,但是你可以利用R函数,比如gsub,或者外部工具

我发现自己正在更新我经常维护的r包的版本和日期。版本和日期均存在于说明中,packageName-package.Rd和man/packageName-package.Rd。我好几次忘记更新一个文件。它们最初是由package.skeleton命令生成的。是否有类似的命令/实用程序脚本来更新版本


编辑:仔细检查后,不需要Rd文件中自动生成的版本和日期。生成的手册中仍会显示正确的日期和版本。显然,这只留下一个地方来更新这些信息。

我不知道有这样的工具,但是你可以利用R函数,比如
gsub
,或者外部工具,比如
grep
sed
,来编程这种行为。这不应该超过几行R.

保罗·希姆斯特拉的想法对我来说非常有用,所以我写了几行代码:

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)
}

是的,谢谢。一个非常切题的问题:是否有任何情况下这些应该有所不同?我想不出有什么。包是代码的集合。版本号枚举此代码集合中的更改。因此,对于不同的版本号没有位置。您可以在rd文件中使用
\Sexpr{}
。这将是一个好主意,尤其是如果我只需要在一个位置进行更新。如何从R CMD check或build绑定变量?好主意。但是,使用此选项时,我将输出设置为二进制。我将
readChar
writeChar
更改为
readLines
writeLines
,现在应该可以更好地工作了吗?
# An R package:
f <- function() "foo"
package.skeleton("Foo","f")

# Update:
upVers("Foo")

# DESCIRPTION now shows version number 1.0.0-1