Question

La valeur par défaut d'un paramètre de ma fonction contient un « % ». Cela semble être un problème pour roxygen, il produit beaucoup d'avertissements et vérification R CMD échoue en essayant de construire la documentation de latex.

Comment puis-je faire de cette fonction (et sa documentation) travail? En utilisant %% ou \% au lieu de% ne permet pas.

#' Test escape \% from in-source documentation (roxygen).
#'
#' What happens when parameters contain special latex characters? 
#'
#' @param x unsuspicious parameter 
#' @param format sprintf format string (default "\%5.0f")
#'
#' @return formatted string
#' @export
#' @author Karsten Weinert
testroxy <- function(x, format = "%5.0f") {
  sprintf(format,x)
}
Était-ce utile?

La solution

#!/usr/bin/perl
use strict;
use File::Temp qw/tempfile/;
use File::Copy;

my $usage = <<EOD

  $0 file1.Rd [file2.Rd ...]

  When using roxygen to generate documentation for an R pacakge, if a default
  argument has a percent sign in it then roxygen will copy it directly into
  the .Rd file. Since .Rd is basically latex, this will be interpreted as a
  comment and case the file to be parsed incorrectly.

  For percent signs elsewhere in your documentation, for example in the
  description of one of the parameters, you should use "\%" so parse_Rd
  interprets it correctly.

  But you cannot do this in the default arguments because they have to be
  valid R code, too.

  Since the .Rd files are automatically generated they should not have
  any latex comments in them anyway.

  This script escapes every unescaped % within the file.

  The .Rd files are modified in place, since it would be easy to
  generate them again with R CMD roxygen.

EOD
;

my $n_tot = 0;
my $n_file = @ARGV;
my $n_esc_file = 0;
foreach my $fn (@ARGV)  {

  print STDERR ' ' x 100, "\rWorking on $fn\t";
  open my $fh, $fn or die "Couldn't open $fn: $!";
  my ($tmp_fh, $tmp_fn) = tempfile();

  my $n;
  while(<$fh>)  {
    $n += s/(?<!\\)%/\\%/g;  # if % is not preceded with backslash then replace it with '\%'
    print $tmp_fh $_;
  }
  $n_tot += $n;
  $n_esc_file ++ if $n;
  print "Escaped $n '%'\n" if $n;
  close $tmp_fh;
  move($tmp_fn => $fn);
}

print "\n";

print "$n_file files parsed\n";
print "$n_esc_file contained at least one unescaped %\n";
print "$n_tot total % were escaped\n";

Ceci est ma solution inélégante. Enregistrez le script perl comme, par exemple, escape_percents.pl, la séquence serait comme ceci:

R CMD roxygen my.package
perl escape_percents.pl my.package.roxygen/man/*.Rd
R CMD install my.package.roxygen

Cela peut introduire plus de problèmes, par exemple si vous avez un exemple de code utilisant %% comme l'opérateur de module, mais il a été très pratique pour moi.

Autres conseils

un code similaire à celui de la question fonctionne pour moi sans problème, et génère la documentation correcte. Comme plusieurs commentaires disent, la raison doit être que j'utilise le paquet roxygen2. Donc, il suffit d'utiliser roxygen2 puis échapper à « % » dans la documentation en utilisant la barre oblique inverse:

#' The percentage sign is written in the documentation like this: \%.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top