Есть ли способ избежать функции round()
при использовании Sweave/knitr? Это действительно раздражает писать round(,2)
в каждом \Sexpr{}
. Я хотел бы иметь два десятичных знака через весь документ.
Спасибо за вашу помощь
Маки
Есть ли способ избежать функции round()
при использовании Sweave/knitr? Это действительно раздражает писать round(,2)
в каждом \Sexpr{}
. Я хотел бы иметь два десятичных знака через весь документ.
Спасибо за вашу помощь
Маки
Если вы прочитали мотивацию пакета knitr
, вы, наверное, знаете, что я человек, который ненавидит round()
внутри \Sexpr{}
больше всего. Я предложил это R core долгое время назад для Sweave, но он был проигнорирован, поэтому я начал свой собственный пакет.
Хотя ответ Джоша О'Брайена абсолютно прав, я должен сказать, что вам действительно нужно только options(digits = 2)
с knitr
, и нет необходимости в reset встроенном крюке по умолчанию, потому что по умолчанию этот признак относится к этой опции.
В knitr
крюк встроенный может использоваться для обработки вывода операторов \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
, даже если в глобальной среде есть другая версия.