2010-04-02 17 views
10

El valor predeterminado de un parámetro de mi función contiene un "%". Esto parece ser un problema para roxygen, produce muchas advertencias y la comprobación de R CMD falla cuando se intenta construir documentación de látex.¿Cómo escapar% en la programación de roxygen alfabetizado?

¿Cómo puedo hacer que funcione esta función (y su documentación)? Usar %% o \% en vez de% no ayuda.

#' 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) 
} 
+0

Sí, lo intenté. Corregí el fragmento de código de arriba. –

+1

¿Ha enviado un correo electrónico a los desarrolladores directamente? Por lo que yo sé, como la mayoría de los desarrolladores R, no comparten el desbordamiento de la pila – hadley

+0

No, no lo hice, pensé que era un error del usuario. Ahora me uní a la lista de correo de roxygen y volví a publicar la pregunta. –

Respuesta

6
#!/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"; 

Ésta es mi solución poco elegante. Guardar el script de perl como, por ejemplo, escape_percents.pl, a continuación, la secuencia sería así:

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

Esto puede introducir más problemas, por ejemplo, si tiene código de ejemplo utilizando %% como el operador de módulo, pero ha sido útil para mí.

+5

O use roxygen2 – hadley

+1

y luego haga ¿qué? – tim

+5

@tim en roxygen 2 puede escapar del signo de porcentaje usando \% – JTextor

5

Código similar al de la pregunta me funciona sin problemas y genera la documentación correcta. Como dicen varios comentarios, la razón debe ser que estoy usando el paquete roxygen2. Así que solo use roxygen2 y luego escape "%" en la documentación usando la barra invertida:

#' The percentage sign is written in the documentation like this: \%. 
+0

Usando 'roxygen2' Supongo? – SymbolixAU

+0

Sí, debe tener razón, esa debe ser la razón. Acabo de instalar RStudio y utilicé lo que venía con él. Cambiaré mi respuesta en consecuencia. ¡Gracias! – jciloa