【问题标题】:Roxygen: how to set a default parameter including backslash ('\') to functionsRoxygen:如何为函数设置默认参数,包括反斜杠('\')
【发布时间】:2011-01-06 14:42:52
【问题描述】:

我使用 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 文件? 抱歉,如果问了一个太明显的问题,但是在 Google 搜索了一段时间后我迷路了。


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


更新:使用roxygen2

【问题讨论】:

  • 这是 roxygen 中的一个简单错误,不需要任何额外配置。据我所知,roxygen 的开发将在不久的将来再次起飞,所以希望它会很快得到修复。
  • 谢谢哈德利,这让事情变得清晰。
  • 你能试着只计算“\”而不是计算“\n”吗?
  • 我现在遇到了与非 ASCII 字符类似的问题,例如param="\u279B"。 (使用 roxygen2 v6.0.1)
  • 我找到了一个很好的解决方法,使用 intToUtf8(),请参阅下面的答案...

标签: r roxygen


【解决方案1】:

我还遇到了太多转义“和消失 \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)。向开发人员发布一个漂亮而优雅的补丁可能也是一个好主意:)
  • 我会这样做,没问题 - 但是我真的不确定这里有没有不需要的副作用。我想“被转义是有原因的。不过,我建议转义制表符和换行符。顺便说一句:在我看来,该项目发生了一些事情-在过去的几个月中,邮件列表和错误和功能跟踪器没有显示任何活动来自开发人员。所以让我们期待 Hadley 不久的将来吧。
  • 没错。虽然我看到@hadley 在github.com/klutometis/roxygen 上经常更新
  • 我知道 Hadley 的分支。然而,afaik 他在很久以前就分叉了,他的和原来的 roxygen 同时看到了相当多的改进(原来的 wrt S4 - 这是我需要的东西,Hadley 的速度很快)。几周前我对他进行了简短的查看,但不幸的是,我没有时间了解这两个系统并将 S4 的内容与他的合并。但是,Hadley,如果您在这里阅读:当然也欢迎您使用补丁。请告诉我。
  • 抱歉,我很困惑 - 现在使用 roxygen2 一切都会好起来的,我希望 :-)
【解决方案2】:

我也遇到过这个问题,即我有 split="\+" 和 split="\|"在各种功能中。

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

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

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

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

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

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

干杯! 尼克

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我在使用 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))
      

      【讨论】:

        【解决方案5】:

        好吧,让我大吃一惊,评论框转义了反斜杠字符!我拒绝增加疯狂并添加反斜杠来转义 perl 代码中的黑斜杠,从而转义 .Rd 文件中的反斜杠,从而转义 R 中的反斜杠。

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

        或者hmm代码标签:

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

        是的,这很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-01
          • 1970-01-01
          • 2019-02-06
          • 1970-01-01
          • 2010-10-28
          相关资源
          最近更新 更多