Programação r/sweave para saída sexpr apropriada
Pergunta
Estou tendo um problema em programar R para Sweave, e o grupo #RSTATS Twitter geralmente aponta aqui, então pensei em fazer essa pergunta à multidão. Sou analista- não um programador- então vá com calma no meu primeiro post.
Aqui está o problema: estou redigindo um relatório de pesquisa em Sweave with r e gostaria de relatar os retornos marginais na fila usando \Sexpr{}
. Por exemplo, em vez de dizer:
Apenas 14% dos entrevistados disseram 'x'.
Eu quero escrever o relatório como este:
Somente sexpr {p.mean (variável)} $ %$ dos entrevistados disseram 'x'.
O problema é que a Swave converte os resultados da expressão em \Sexpr{}
para uma sequência de caracteres, o que significa que a saída da expressão em r e a saída que aparece no meu documento é diferente. Por exemplo, acima, eu uso a função 'P.mean':
p.mean<- function (x) {options(digits=1) mmm<-weighted.mean(x, weight=weight, na.rm=T) print(100*mmm) }
Em R, a saída se parece com a seguinte:
p.mean(variable) >14
Mas quando eu uso \Sexpr{p.mean(variable)}
, Recebo uma string de personagem não arredondada (neste caso: 13.5857142857143) no meu documento. Eu tentei limitar a saída da minha função a digits=1
no ambiente global, na própria função e em vários comandos. Parece conter apenas quais impressões R, não a transformação do caractere que é o resultado da expressão e que eventualmente imprime no arquivo LATEX.
as.character(p.mean(variable)) >[1] 14 >[1] "13.5857142857143"
Alguém sabe o que posso fazer para limitar os dígitos impressos no arquivo de látex, reprogramando a função R ou com uma configuração em Sweave ou \Sexpr{}
?
Solução
@Kennytm entendeu. @David, você deve evitar options(digits = 1)
pois afetará todos os seus cálculos (ele suprimirá os decimais em cada saída posteriormente). Então use round()
função após aplicar o weighted.mean()
. Algo assim:
\Sexpr{round(p.mean(x))}
E não faça usar print()
, mas return()
. Aqui está o porquê:
> 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
Usar return()
ou apenas digite a variável resultante na última linha:
> bar <- function(x) {
res <- mean(x) + 5
return(res)
}
> bar(x) + 10
[1] 15
Então, reescreva sua função e certifique -se de usar as.character()
... Você tem todos os bits, agora apenas junte tudo.
Ps
Não tenho certeza de como você funciona funciona ... Eu nunca usei pesado significa na minha análise. A parte que mais me intriga é weight=weight
. Não seria melhor colocar mais um argumento em função? Francamente, ainda estou impressionado com o fato de sua função estar lhe dando resultado certo ... provavelmente porque você tem weight
variável definida antes da definição da função. EDITAR Você não vou Obtenha a média ponderada com sua função, se você não tiver weight
Função predefinida, mas significa "regular"!
Espero que este tenha ajudado você!
Atenciosamente, Aleksandar
Outras dicas
Tente 'formato':
options(digits=1)
e depois:
\Sexpr{format(p.mean(variable))}
Você também pode usar o argumento 'nsmall':
options(digits=3)
...
\Sexpr{format(sqrt(2)-0.41,nsmall=2)}
E você também pode tentar 'sprintf' se estiver familiarizado com C.
as.character(round(p.mean(variable)))
?
A função sprintf () é ótima para formatar saída numérica.
o siunitx O pacote também pode ser usado para formatar números de Sweave.
Código para Sweave
O script a seguir mostra como usá -lo para formatar números, a sintaxe é para Arrancrar. No preâmbulo, você pode definir sua formatação padrão como
\sisetup{
round-mode = figures,
round-precision = 3
}
e depois substitui -o nos comandos \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}
Código para Knitr
Em Knitr por padrão, os números em sexpr são arredondados quando a opção options(digits = 2)
está definido. Mas se você deseja arredondamento diferente em diferentes lugares, o código a seguir funciona, ele precisa ser adaptado, pois não há necessidade de escapar duas vezes antishashes em sexpr em 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))
}
}