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{}?

Foi útil?

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}

enter image description here

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))
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top