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

22

我使用Roxygen来为正在开发的软件包生成Rd文件,但是我在默认参数设置为'\n'的函数方面遇到了一些问题,例如:

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

这个函数的目的是计算一个字符串中换行符 ('\n') 的数量。但问题在于 R CMD check 给出了一个警告:

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
这是 roxygen 中一个简单的 bug,不需要任何额外的配置。据我所知,roxygen 的开发将在不久的将来重新启动,因此希望能很快解决这个问题。 - hadley
谢谢,Hadley。这让事情变得清晰明了。 - daroczig
你能否尝试仅计算 "" 而不是计算 "\n" 呢? - Jake Sankey
我现在遇到了与非 ASCII 字符类似的问题,例如 param="\u279B"。(使用 roxygen2 v6.0.1) - Viliam Simko
我找到了一个不错的解决方法,使用intToUtf8(),请看下面我的回答... - Viliam Simko
5个回答

3

我也遇到了太多转义的 " 和消失的 \t 问题。最终,我修改了 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))
    }
  }

希望这有所帮助,不会影响其他任何东西。

感谢@cbeleites的修改,它在我的情况下似乎有效(+1)。向开发人员发布一个漂亮而优雅的补丁也是一个好主意 :) - daroczig
我可以做到这一点,没有问题 - 但是我真的不确定这里是否会产生不必要的副作用。我猜想引号被转义的原因是有道理的。我建议转义制表符和换行符。 顺便说一句:对我来说,项目似乎出了些问题 - 在过去的几个月中,邮件列表、错误和功能跟踪器都没有显示开发人员的任何活动。所以让我们期待哈德利的近期情况。 - cbeleites unhappy with SX
没错。虽然我看到@hadley在https://github.com/klutometis/roxygen上经常更新。 - daroczig
我知道Hadley的分支。然而,据我所知,他早就分叉了他和原始的roxygen,同时也看到了相当多的改进(原始的wrt S4 - 这是我需要的东西,Hadley的则在速度方面)。几周前我简单地看了一下他的代码,但不幸的是,我没有时间理解两个系统并将S4内容与他的合并。然而,如果你在这里阅读,Hadley:当然,您也可以提交补丁。只要让我知道即可。 - cbeleites unhappy with SX
抱歉,我有些困惑 - 现在使用roxygen2一切都会好起来的,希望如此 :-) - cbeleites unhappy with SX

0

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

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

0

我也遇到了这个问题,即在各种函数中使用了split="\+"和split="\|"。

.Rd文件实际上也将它们表示为split="\+"和split="\|",但是无论是什么读取.Rd文件的R CMD检查都将它们转换为split="+"和split="\|",从而导致错误。

如果.Rd文件中有split="\\+"和split="\\|",那么它就会被正确读取。

我的解决方案是在运行R CMD检查之前,在/man/目录下的.Rd文件上运行以下命令:

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

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

经过一些尝试和错误,但它确实有效!

干杯! Nick


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

-1

哎呀,该死,评论框逃避反斜杠字符!我拒绝加入混乱,并在 Perl 代码中添加反斜杠来转义 .Rd 文件中转义 R 中的反斜杠。

只需将所有反斜杠加倍即可。

或者使用代码标签:

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

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

好的,没问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接