Я понимаю, что это старо, но, возможно, эта функция, которую я создал, полезна кому-то там:
order_axis<-function(data, axis, column)
{
# for interactivity with ggplot2
arguments <- as.list(match.call())
col <- eval(arguments$column, data)
ax <- eval(arguments$axis, data)
# evaluated factors
a<-reorder(with(data, ax),
with(data, col))
#new_data
df<-cbind.data.frame(data)
# define new var
within(df,
do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a)))
}
Теперь, с помощью этой функции вы можете интерактивно рисовать с помощью ggplot2, например:
ggplot(order_axis(df, AXIS_X, COLUMN_Y),
aes(x = AXIS_X_o, y = COLUMN_Y)) +
geom_bar(stat = "identity")
Как можно видеть, функция order_axis
создает еще один фрейм данных с новым столбцом с именем то же, но с _o
в конце. Этот новый столбец имеет уровни в порядке возрастания, поэтому ggplot2 автоматически закладывается в этом порядке.
Это несколько ограничено (работает только для символьных или факторных и числовых комбинаций столбцов и в порядке возрастания), но я по-прежнему считаю это очень полезным для построения графика на ходу.
Этот ответ скорее должен быть комментарием, но комментарии не позволяют представить более сложный код ...
Джон Кугельман уже дал соответствующий ответ , но код еще может быть лучше структурирован:
if(haveSeenDecimalPoint)
// while braces are optional in given case, they still better are placed
// as the following code is pretty complex; you gain better overview
{
if('0' <= ch && ch <= '9') // optional; ressembles closer mathematical
// expression 0 <= ch <= 9
// (which cannot be written that way in C++!)
num++;
else
break;
}
// if decimal point HAS been found already, no need to check any further
// so place the else to avoid unnecessary checks (if another period occures,
// it's already covered by breaking on ch < '0' || ch >= '9')
else if(ch == '.')
{ // due to the newly introduced else: recommendation: if one branch needs
// braces, place on all of them – some coding conventions even mandate
// ALWAYS placing braces
haveSeenDecimalPoint = true;
}
Код без комментариев:
[ 111]Следите за дополнительными помещениями, они также улучшают читаемость.
Этот цикл выполняет две разные вещи и использует f
для отслеживания того, что он делает. Это часто сбивает с толку, и код, вероятно, должен быть написан в виде двух отдельных циклов:
// skip until the decimal point
while ((ch = getchar()) != '\n' && ch != '.')
; // nothing to do here
// check that we haven't hit the end of the input
if (ch != '\n')
// count digit characters
while ((ch = getchar()) >= '0' && ch <= '9')
++num;
Обратите внимание, что в последнем цикле нет явной проверки для '\n'
; в этом нет необходимости, потому что '\n'
не будет между '0'
и '9'
, поэтому получение '\n'
завершит цикл.