Подтвердить что ты не робот

Как избежать использования round() в каждом \Sexpr {}?

Есть ли способ избежать функции round() при использовании Sweave/knitr? Это действительно раздражает писать round(,2) в каждом \Sexpr{}. Я хотел бы иметь два десятичных знака через весь документ.

Спасибо за вашу помощь
Маки

4b9b3361

Ответ 1

Если вы прочитали мотивацию пакета knitr, вы, наверное, знаете, что я человек, который ненавидит round() внутри \Sexpr{} больше всего. Я предложил это R core долгое время назад для Sweave, но он был проигнорирован, поэтому я начал свой собственный пакет.

Хотя ответ Джоша О'Брайена абсолютно прав, я должен сказать, что вам действительно нужно только options(digits = 2) с knitr, и нет необходимости в reset встроенном крюке по умолчанию, потому что по умолчанию этот признак относится к этой опции.

Ответ 2

В 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)

Ответ 3

Во-первых, вы, возможно, захотите использовать 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, даже если в глобальной среде есть другая версия.