Question

Je vais avoir un peu de programmation de problème pour R Sweave, et le groupe twitter de #rstats souvent des points ici, donc je pensais que je pose cette question à la foule SO. Je suis un analyste- pas Programmeur donc aller simple sur mon premier poste.

Voici le problème: Je suis en train de rédiger un rapport d'enquête dans Sweave avec R et voudrais signaler les rendements marginaux en ligne à l'aide \Sexpr{}. Par exemple, plutôt que de dire:

  

Seulement 14% des répondants ont dit 'X'.

Je veux écrire le rapport comme celui-ci:

  

uniquement \ {SEXPR p.mean (variable)} $ \% $ des répondants ont dit 'X'.

Le problème est que Sweave convertit les résultats de l'expression dans \Sexpr{} à une chaîne de caractères, ce qui signifie que la sortie de l'expression dans la R et la sortie qui apparaît dans mon document sont différents. Par exemple, au-dessus utiliser la fonction « p.mean »:

p.mean<- function (x) {options(digits=1)  
mmm<-weighted.mean(x, weight=weight, na.rm=T)  
print(100*mmm)  
}

En R, la sortie ressemble à ceci:

p.mean(variable)
>14

mais quand je l'utilise \Sexpr{p.mean(variable)}, je reçois une chaîne de caractères unrounded (dans ce cas: 13,5857142857143) dans mon document. J'ai essayé de limiter la sortie de ma fonction à digits=1 dans l'environnement mondial, dans la fonction elle-même, et et dans diverses commandes. Il semble que pour contenir ce que R imprime, et non la transformation de caractère qui est le résultat de l'expression et qui imprime éventuellement dans le fichier LaTeX.

as.character(p.mean(variable))  
>[1] 14  
>[1] "13.5857142857143"  

Quelqu'un sait-il ce que je peux faire pour limiter les chiffres imprimés dans le fichier LaTeX, que ce soit en reprogrammant la fonction R ou avec un paramètre dans Sweave ou \Sexpr{}?

Était-ce utile?

La solution

@KennyTM a obtenu. @ David, vous devez éviter options(digits = 1) car il aura une incidence sur tous vos calculs (il supprimera les décimales dans chaque sortie par la suite). Il faut donc utiliser la fonction round() après l'application du weighted.mean(). Quelque chose comme ceci:

\Sexpr{round(p.mean(x))}

ne pas utilisation print(), mais return(). Voici pourquoi:

> set.seed(1234)
> x <- rnorm(100)
> foo <- function(x) {
   res <- mean(x) + 5
   print(res)
}
> foo(x)
[1] 5
> foo(x) + 10
[1] 5
[1] 15

Utilisez return() ou tapez simplement la variable résultant dans la dernière ligne:

> bar <- function(x) {
   res <- mean(x) + 5
   return(res)
}
> bar(x) + 10
[1] 15

Alors, réécrire votre fonction, et assurez-vous d'utiliser as.character() ... vous avez tous les bits, maintenant il suffit de mettre tous ensemble.

P.S.

Je ne sais pas comment vous fonctionnez travaux ... Je ne l'ai jamais utilisé pesaient dire dans mon analyse. Le bit qui me le plus déconcertant est weight=weight. Ne serait-il pas plus agréable de mettre un argument en fonction? Franchement, je suis toujours étonné par le fait que votre fonction vous donne un bon résultat ... probablement parce que vous avez défini la variable weight avant la définition fonctionner. [EDIT] Vous ne sera pas obtenir la moyenne pondérée avec votre fonction si vous n'avez pas fonction weight prédéfinie, mais "régulier" signifie!

J'espère que celui-ci vous a aidé!

Cordialement, Aleksandar

Autres conseils

Try 'format':

options(digits=1)

et

\Sexpr{format(p.mean(variable))}

Vous pouvez également utiliser l'argument 'nPetite':

options(digits=3)
...
\Sexpr{format(sqrt(2)-0.41,nsmall=2)}

Et vous pouvez aussi essayer « sprintf » si vous êtes familier avec C.

as.character(round(p.mean(variable)))

?

la fonction sprintf () est grande pour le formatage de sortie numérique.

Le paquet siunitx peut aussi être utilisé pour les numéros de format dans Sweave.

Code pour Sweave

Le script suivant montre comment l'utiliser pour formater des chiffres, la syntaxe est Sweave . Dans le préambule, vous pouvez configurer votre formatage par défaut comme

\sisetup{
round-mode = figures,
round-precision = 3
}

puis la remplacer dans les commandes \Sexpr{num(pi,round_precision=2)}

\documentclass[a4paper]{article}
\usepackage{siunitx}
\usepackage{Sweave}
\title{siunitx}

\sisetup{
round-mode = figures,
round-precision = 3
}
\begin{document}

\maketitle
<<sanitize_number,echo=FALSE>>=
num <- function(x,round_precision=NULL)
{
  if (is.null(round_precision)) {
    return(sprintf("\\\\num{%s}", x))
  } else {
    return(sprintf("\\\\num[round-precision=%s]{%s}",round_precision, x))
  }
}
@
Examples :\\
round\_precision= 2 gives : \Sexpr{num(pi,round_precision=2)} \\
round\_precision= 4 gives : \Sexpr{num(pi,round_precision=4)}\\
Default formatting gives : \Sexpr{num(pi)}
\end{document}

Code pour knitr

Dans knitr par défaut, les nombres \ SEXPR sont arrondis lorsque l'option options(digits = 2)is définie. Mais si vous voulez différents arrondi à différents endroits le code suivant fonctionne, il doit être adapté car il n'y a pas besoin de doubler antislashes d'échappement dans \ SEXPR dans knitr.

num <- function(x,round_precision=NULL)
{
  if (is.null(round_precision)) {
    return(sprintf("\\num{%s}", x))
  } else {
    return(sprintf("\\num[round-precision=%s]{%s}",round_precision, x))
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top