Как делает Roxygen для обработки двоичных операторов инфикса (напр. %в%)?


Как простой, конкретный пример:

#' Inverse Value Matching
#' 
#' Complement of code{%in%}. Returns the elements of code{x} that are
#' not in code{y}.
#' @usage x %nin% y
#' @param x a vector
#' @param y a vector
#' @export
"%nin%" <- function(x, y) {
  return( !(x %in% y) )
}

Однако, когда я пытаюсь построить пакет, функция, кажется, игнорируется, и никакой документации не создается.

Там, кажется, есть однострочное объявление о двоичных функциях инфикса в http://cran.r-project.org/doc/manuals/r-release/R-exts.html#Documenting-functions , но мне трудно проанализировать его и то, что он будет означать для документации Roxygen.

2 4

2 ответа:

Вам нужно избежать % s в разделе usage. Кроме того, я думаю, что вам может потребоваться указать rdname

#' Inverse Value Matching
#' 
#' Complement of \code{%in%}. Returns the elements of \code{x} that are
#' not in \code{y}.
#' @usage x \%nin\% y
#' @param x a vector
#' @param y a vector
#' @export
#' @rdname nin
"%nin%" <- function(x, y) {
  return( !(x %in% y) )
}

Вот функция, которую я имею в личном пакете. Я не думаю, что когда-либо использовал эту функцию, но roxygenize создает файл справки, и пакет проходит R CMD check.

#' percent in
#' 
#' calculate the percentage of elements of \code{table} that are in \code{x}
#' 
#' @param x vector or NULL: the values to be matched
#' @param table vector or NULL: the values to be matched against
#' @return percentage of elements of \code{x} that are in \code{table}
#' @author gsee
#' @usage x \%pctin\% table
#' @examples
#' letters[1:10] %pctin% letters[1:3] # 30% of the second arg ar in the first
#' @export
#' @rdname PctIn
"%pctin%" <- function(x, table) length(x[x %in% table])/length(x)

У меня были трудные времена с roxygen (Говоря о roxygen не roxygen2) и операторами инфикса. Вот что сработало с моей установкой (R 2.15.1, roxygen 0.1-3).

Первое решение: отредактируйте файл Rd каждого оператора инфикса (должен быть grapes ... grapes.Rd) и экранируйте с помощью baskslash каждый % в\alias, \usage и \nameчасти.

Второе решение: укажите теги @name и @usage в документации оператора infix и экранируйте %. Вот пример:

##' Concatenates two strings
##'
##' @name \%+\%
##' @usage \%+\%(x, y)
##' @title Concatenation operator.
##' @param a String.
##' @param b String.
##' @return Same as paste0(a, b).
"%+%" <- function(a, b) paste(a, b, sep = "")