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

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

Спасибо за помощь
Mac


person beginneR    schedule 16.06.2012    source источник
comment
ИМХО, для этого можно установить хук. Или попробуйте pander, который делает это автоматически :)   -  person daroczig    schedule 16.06.2012
comment
Вы хотите ограничить вывод максимум двумя цифрами или всегда хотите две цифры, даже если они равны нулю (1.00)? Первое, чего вы должны достичь, установив options( digits = 2 ) в своем первом фрагменте.   -  person vaettchen    schedule 16.06.2012
comment
@vaettchen: установив digits в 2, вы получите pi*100 как 314, что является довольно грубой оценкой.   -  person daroczig    schedule 16.06.2012
comment
возможный дубликат Программирование R/Sweave для правильного вывода \Sexpr   -  person Waldir Leoncio    schedule 30.07.2013


Ответы (3)


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

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

person Yihui Xie    schedule 17.06.2012
comment
Спасибо за эту подсказку. Это действительно большое облегчение. Я совсем новичок в работе с R и LaTeX, но тем не менее преимущества перед Sweave достаточно очевидны. Я думаю, что через короткое время большинство людей перейдут на вязание. - person beginneR; 18.06.2012

В 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)
person Josh O'Brien    schedule 16.06.2012
comment
+1 - аккуратно, так как это добавляет возможность различать встроенный вид и внешний вид фрагмента! - person petermeissner; 21.05.2013
comment
@PeterM -- Абсолютно! См. ответ Батиста здесь для другого (очень полезный) пример настраиваемого встроенного хука. - person Josh O'Brien; 21.05.2013

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

person Aaron left Stack Overflow    schedule 16.06.2012
comment
Так естественно думать о темных вуду со Sweave :) Вы точно знаете, где Sweave должен измениться, и это также то, что я предложил R core (они могут сделать лучше не только с помощью as.character) и проигнорировали их. - person Yihui Xie; 17.06.2012
comment
Да, темное вуду действительно. У меня есть пара вариантов драйверов, которые добавляют определенные функции, которые мне нужны, но их сложно писать и поддерживать. Я постоянно слышу хорошие отзывы о knitr и о том, как это упрощает многие вещи. Надеюсь скоро попробовать. Спасибо за вашу работу над этим, @Yihui. - person Aaron left Stack Overflow; 17.06.2012