Есть ли способ избежать использования функции round()
при использовании Sweave/knitr? Очень раздражает писать round(,2)
в каждом \Sexpr{}
. Я хотел бы иметь два десятичных знака во всем документе.
Спасибо за помощь
Mac
Есть ли способ избежать использования функции round()
при использовании Sweave/knitr? Очень раздражает писать round(,2)
в каждом \Sexpr{}
. Я хотел бы иметь два десятичных знака во всем документе.
Спасибо за помощь
Mac
Если вы прочитали мотивацию knitr
package, вы, наверное, знаете, что я человек, который больше всего ненавидит round()
внутри \Sexpr{}
. Я давно предлагал это ядро R для Sweave, но оно было проигнорировано, поэтому я создал свой собственный пакет.
Хотя ответ Джоша О'Брайена абсолютно правильный, я должен сказать, что вам действительно нужно только options(digits = 2)
с knitr
, и нет необходимости сбрасывать встроенный хук по умолчанию, потому что хук по умолчанию учитывает эту опцию.
В knitr
хук inline может использоваться для обработки вывода операторов \Sexpr{}
. Итак, если вы хотите напечатать только 2 цифры после запятой для встроенного кода (оставив только общую опцию digits
), вы можете сделать это следующим образом:
## First have a look at the default inline hook function
knit_hooks$get("inline")
## Then customize it to your own liking
inline_hook <- function(x) {
if(is.numeric(x)) x <- round(x, 2)
paste(as.character(x), collapse=", ")
}
knit_hooks$set(inline = inline_hook)
Во-первых, вы, возможно, захотите использовать formatC
вместо round
, чтобы получить две цифры, даже если они равны нулю. В Sweave нет хорошего способа сделать это; лучший вариант, вероятно, просто создать новую функцию с коротким именем, которое будет выполнять нужное вам форматирование; что-то типа
p <- function(x) {formatC(x, format="f", digits=2)}
Это, по крайней мере, немного экономит ввод текста:
The answer is $\Sexpr{p(x)}$.
К сожалению, без возни с новым драйвером Sweave, я думаю, больше нечего делать (возможно, это еще одна причина попробовать knitr
, который, кажется, быстро набирает силу). Sweave делает это с тем, что находится внутри вашего оператора Sexpr
, а затем заменяет вызов Sexpr
результатом.
as.character(eval(parse(text = cmd), envir = .GlobalEnv))
Однако вы не можете просто написать новую версию as.character
; помимо проблемы, что он может изменить поведение другими неожиданными способами, из-за пространства имен он всегда вызывает версию в base
, даже если в глобальной среде есть другая версия.
as.character
) и проигнорировали их.
- person Yihui Xie; 17.06.2012
knitr
и о том, как это упрощает многие вещи. Надеюсь скоро попробовать. Спасибо за вашу работу над этим, @Yihui.
- person Aaron left Stack Overflow; 17.06.2012
1.00
)? Первое, чего вы должны достичь, установивoptions( digits = 2 )
в своем первом фрагменте. - person vaettchen   schedule 16.06.2012digits
в2
, вы получитеpi*100
как314
, что является довольно грубой оценкой. - person daroczig   schedule 16.06.2012