Roxygen:如何设置默认参数,包括反斜杠('\')到函数

时间:2011-01-06 14:42:53

标签: r roxygen

我使用Roxygen生成正在开发的包的Rd文件,但是我将函数的默认参数设置为'\n',例如:

  lineCount <- function(text, sep='\n') {
       ...
   }

在字符串中计算新行('\n')字符的目的是什么。 问题是R CMD检查发出警告:

Codoc mismatches from documentation object 'lineCount':
lineCount
  Code: function(text, sep = "\n")
  Docs: function(text, sep = " ")
  Mismatches in argument default values:
    Name: 'sep' Code: "\n" Docs: " "

在我看来,写入Rd文件引起的问题(通过cat()写入标准LaTeX文件总是需要为某些目的双重转义字符,例如:\\newline - 正如我所经历的那样) 。 如果我在分隔符上添加一个额外的反斜杠,例如:

  lineCount <- function(text, sep='\\n') {
       ...
   }

问题仍然存在,如代码所示'\\n',但在文档(Rd文件)中,它看起来像'\n'

我的问题有一个简单的解决方案吗?可能是Roxygen中的额外标签,它可以定义如何将函数的参数写入Rd文件? 如果被问到太明显的问题,我很抱歉,但是在谷歌推出一段时间后我就迷失了。


历史:http://permalink.gmane.org/gmane.comp.lang.r.roxygen/24


更新:使用roxygen2

5 个答案:

答案 0 :(得分:3)

我也遇到了太多逃脱的问题,并且消失了。我最终改变了roxygen的Rd2.R中的parse.formals函数,如下所示:

  parse.formals <- function(partitum) {
    formals <- partitum$formals
    if (!is.null(formals)) {
      formals <- lapply(formals, trim)
      formals <- lapply(formals, paste, collapse=" ")
      name.defaults <- zip.c(names(formals), formals)
      args <-
        do.call(paste, c(Map(function(name.default) {
          name <- car(name.default)
          default <- cadr(name.default)
          if (! is.character (default)) {  # too much escaped. 
                                           # Not sure when escaping is needed. 
                                           # param = c ("x", "y", "z") works now
            default <- gsubfn("\"(.*)\"",
                              function(x)
                              sprintf("\"%s\"", gsub("\"", "\\\\\"", x)),
                              as.character(default))
          }
          default <- gsub ("\t", "\\\\t", default) # the tabs and newlines are already
          default <- gsub ("\n", "\\\\n", default) # tab and newline here.
          if (is.null.string(default))
            name
          else
            sprintf('%s=%s', name, default)
        },
                             name.defaults),
                         sep=', '))

      append.Rd(usageTag(parse.function.name(partitum), args))
    }
  }

希望有助于而且不会破坏其他任何东西。

答案 1 :(得分:0)

我也遇到过这个问题,即我有分裂=“\ +”和split =“\ |”各种功能。

.Rd文件实际上也将它们表示为split =“\ +”和split =“\ |”,但随后在R CMD检查中读取的任何.Rd文件将它们转换为split =“+”和split =“\ |“,并导致错误。

如果.Rd文件有split =“\\ +”和split =“\\ |”然后它会被正确读取。

我的解决方案是使用.Rd文件在/ man /目录上运行它,就在R CMD检查之前:

perl -e's /(“\\\ |”)/“\\\\\ |”/ g;' -pi $(找到BioGeoBEARS / man -type f)

perl -e's /(“\\ +”)/“\\\\ +”/ g;' -pi $(找到BioGeoBEARS / man -type f)

进行了一些试验和错误,但它确实有效!

干杯! 尼克

答案 2 :(得分:0)

我遇到了同样的问题。我最终用@usage覆盖源代码中的roxygen生成的默认用法字段。例如。 R源文件包含

#' @usage sourceall(dir = getwd(), pattern = ".*\\\\.R", ...)
sourceall <- function( dir=getwd(), pattern=".*\\.R", ... )
{
    blah blah
}

答案 3 :(得分:0)

我遇到过roxygen2 v6.0.1的类似问题。

# this caused errors in R CMD check (non-ASCII chars)
f <- function(x, y, chr = "\u279B")

# this was ok
f <- function(x, y, chr = intToUtf8(0x279B))

在你的情况下,使用换行符,它也应该有效:

lineCount <- function(text, sep = intToUtf8(10))

答案 4 :(得分:-1)

好吧,告诉我,评论框会逃避反斜杠字符!我拒绝添加疯狂并添加反斜杠来逃避perl代码中的黑色斜杠,这些代码逃脱了.Rd文件中的反斜杠,这些文件逃避了R中的反斜杠。

只需加倍所有反斜杠。

或嗯代码标签:

perl -e 's/("\\\\\|")/"\\\\\\\\\|"/g;' -pi $(find BioGeoBEARS/man -type f)

perl -e 's/("\\\\\+")/"\\\\\\\\\+"/g;' -pi $(find BioGeoBEARS/man -type f)

是的,这很好。