Может кто-нибудь объяснить, почему эта программа может считать количество цифр после десятичной точки?

Я понимаю, что это старо, но, возможно, эта функция, которую я создал, полезна кому-то там:

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 автоматически закладывается в этом порядке.

Это несколько ограничено (работает только для символьных или факторных и числовых комбинаций столбцов и в порядке возрастания), но я по-прежнему считаю это очень полезным для построения графика на ходу.

-5
задан 31 March 2019 в 01:15
поделиться

2 ответа

Этот ответ скорее должен быть комментарием, но комментарии не позволяют представить более сложный код ...

Джон Кугельман уже дал соответствующий ответ , но код еще может быть лучше структурирован:

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]

Следите за дополнительными помещениями, они также улучшают читаемость.

0
ответ дан Aconcagua 31 March 2019 в 01:15
поделиться

Этот цикл выполняет две разные вещи и использует 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' завершит цикл.

0
ответ дан Pete Becker 31 March 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: