Программирование R/Sweave для надлежащего \Sexpr производится

У меня есть определенное программирование R задач для Sweave и #rstats, на который группа Твиттера часто указывает здесь, таким образом, я думал, что поместил этот вопрос ТАК толпа. Я - аналитик - не программист - поэтому не переборщите с моим первым сообщением.

Вот проблема: Я готовлю отчет об обзоре в Sweave с R и хотел бы сообщить о крайних возвратах в использовании строки \Sexpr{}. Например, вместо высказывания:

Только 14% респондентов сказали 'X'.

Я хочу написать отчет как это:

Только \Sexpr {p.mean (переменная)} $\\$ % респондентов сказал 'X'.

Проблема состоит в том, что Sweave преобразовывает результаты выражения в \Sexpr{} к символьной строке, что означает, что вывод от выражения в R и вывод, который появляется в моем документе, отличаются. Например, выше я использую функцию 'p.mean':

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

В R вывод похож на это:

p.mean(variable)
>14

но когда я использую \Sexpr{p.mean(variable)}, Я получаю неокругленную символьную строку (в этом случае: 13.5857142857143) в моем документе. Я попытался ограничить вывод своей функции к digits=1 в глобальной среде, в самой функции, и и в различных командах. Это только, кажется, содержит то, что R печатает, не символьное преобразование, которое является результатом выражения и которое в конечном счете печатает в ЛАТЕКСНОМ файле.

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

Делает любой знает то, что я могу сделать для ограничения цифр, распечатанных в ЛАТЕКСНОМ файле, или путем перепрограммирования функции R или с установкой в Sweave или \Sexpr{}?

7
задан hopper 29 July 2013 в 21:01
поделиться

4 ответа

@KennyTM понял. @David, вам следует избегать опций (цифры = 1) , так как это повлияет на все ваши вычисления (впоследствии он будет подавлять десятичные дроби в каждом выводе). Поэтому используйте функцию round () после применения weighted.mean () . Примерно так:

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

И не используют print () , но return () . Вот почему:

> 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

Используйте return () или просто введите результирующую переменную в последней строке:

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

Итак, перепишите свою функцию и обязательно используйте as.character () ... у вас есть все кусочки, теперь просто сложите все вместе.

P.S.

Я не уверен, как вы работаете ... Я никогда не использовал средневзвешенное значение в своем анализе. Больше всего меня озадачивает вес = вес . Разве не было бы лучше включить в функцию еще один аргумент? Честно говоря, меня все еще поражает тот факт, что ваша функция дает правильный результат ... вероятно, потому, что у вас есть переменная weight , определенная до определения функции. [РЕДАКТИРОВАТЬ] Вы не получите взвешенное среднее значение с помощью своей функции, если у вас нет предопределенной функции weight , но есть «обычное» среднее значение!

Надеюсь, этот вам помог!

С уважением, Александр

4
ответ дан 7 December 2019 в 01:19
поделиться
as.character(round(p.mean(variable)))

?

2
ответ дан 7 December 2019 в 01:19
поделиться

функция sprintf() отлично подходит для форматирования числового вывода.

1
ответ дан 7 December 2019 в 01:19
поделиться

Попробуйте формат ':

options(digits=1)

а затем:

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

Вы также можете использовать аргумент' nsmall ':

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

И вы также можете попробовать' sprintf ', если вы знакомы с C.

3
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: