2010-04-02 9 views
10

Domyślna wartość parametru mojej funkcji zawiera "%". Wydaje się to być problemem dla tlenu, powoduje wiele ostrzeżeń i kontrola R CMD kończy się niepowodzeniem, gdy próbujemy zbudować dokumentację lateksową.Jak uniknąć ucieczki% w programowaniu piśmiennictwa?

Jak mogę wykonać tę funkcję (i jej dokumentację)? Używanie %% lub \% zamiast% nie pomaga.

#' 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

Tak Próbowałem obu. Poprawiłem fragment kodu powyżej. –

+1

Czy wysłałeś bezpośrednio e-mail do programistów? O ile mi wiadomo, jak większość programistów R, nie spędzają czasu na przepełnieniu stosu. – hadley

+0

Nie, nie, myślałem, że to błąd użytkownika. Teraz dołączyłem do listy mailingowej roxygen i przesłałem to pytanie. –

Odpowiedz

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"; 

To mój nieeleganckie rozwiązanie. Zapisz skrypt perla jak, na przykład, escape_percents.pl, to sekwencja będzie tak:

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

To może wprowadzić więcej problemów, na przykład, jeśli masz przykładowy kod korzystania %% jako operator modułu, ale było to dla mnie przydatne.

+5

Lub użyj roxygen2 – hadley

+1

, a następnie zrób co? – tim

+5

@tim in roxygen 2 można uciec znak procentu za pomocą \% – JTextor

5

Kod podobny do tego w pytaniu działa dla mnie bez problemu i generuje poprawną dokumentację. Jak mówi wiele komentarzy, powodem musi być to, że używam pakietu roxygen2. Więc po prostu użyj roxygen2, a następnie ucieknij "%" w dokumentacji używając odwrotnego ukośnika:

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

Używając 'roxygen2', jak sądzę? – SymbolixAU

+0

Tak, musisz mieć rację, to musi być powód. Właśnie zainstalowałem RStudio i użyłem wszystkiego, co do niego przyszło. Zmienię odpowiednio moją odpowiedź. Dzięki! – jciloa