Петля с утверждением if в R [дубликат]

Я думаю, что предоставленные ответы вводят в заблуждение. Свойство, определенное внутри класса, становится свойством экземпляра, когда объект создается, независимо от того, как вы его определяете. Таким образом, копии a.list сделаны, а x.list и y.list - разные копии. Причина, по которой они кажутся одинаковыми, заключается в том, что они оба являются псевдонимами в том же списке. Но это следствие того, как работают списки, а не того, как работают классы. Если бы вы делали то же самое с числами вместо списков (или просто используя + = вместо append, что создало бы новый список), вы увидите, что изменение x.attr не влияет на изменение y.attr.

Определяет self.list внутри __init__, потому что функция вызывается дважды, один раз для каждого экземпляра объекта, и поэтому создается два разных списка.

2
задан Jelena-bioinf 24 August 2015 в 11:56
поделиться

3 ответа

Оператор двоеточия будет иметь приоритет над арифметическими операциями. Всегда лучше экспериментировать с примерами, чтобы усвоить логику:

2*2:6-1

Какой ответ мы должны ожидать? Некоторые скажут 4 5. Мысль состоит в том, что он упростится до 2*2=4 и 6-1=5, поэтому 4:5.

2*2:6-1
[1]  3  5  7  9 11

Этот ответ удивит всех, кто не рассмотрел порядок операций в игре. Выражение 2*2:6-1 упрощается по-разному. Сначала выполняется последовательность 2:6, затем умножение и, наконец, добавление. Мы могли бы записать его как 2 * (2 3 4 5 6), который 4 6 8 10 12 и вычесть 1 из этого, чтобы получить 3 5 7 9 11.

. Сгруппировавшись с скобками, мы можем контролировать порядок операций, как мы это сделали аналогично в основной арифметике, чтобы получить ответ, который мы сначала ожидали.

(2*2):(6-1)
[1] 4 5

Вы можете применить это рассуждение к вашему примеру, чтобы исследовать кажущееся странным поведение оператора :.

Теперь, когда вы знаете секретные коды, чего мы должны ожидать от (2*2):6-1?

3
ответ дан Pierre Lafortune 23 August 2018 в 17:39
поделиться

nrow(planets_df)-3:nrow(planets_df) оценивается как 8 - (3: 8) или

(8-3) (8-4) (8-5) (8-6) (8-7) (8-8) = 5 4 3 2 1 0

Если вы хотите использовать последние несколько строк, используйте tail(planets_df, 3)

1
ответ дан Jay 23 August 2018 в 17:39
поделиться

Двоеточие : отделяет начальную точку от конечной точки последовательности. Он обрабатывается с более высоким приоритетом, чем оператор + или -. Поэтому

nrow(planets_df)-3:nrow(planets_df)

равно

nrow(planets_df) - (3:nrow(planets_df))

. Если вы хотите иметь последние три записи, используя этот синтаксис, вам нужно поместить все выражение, определяющее начало последовательность в скобки:

planets_df[(nrow(planets_df)-3):nrow(planets_df),]
2
ответ дан RHertel 23 August 2018 в 17:39
поделиться
Другие вопросы по тегам:

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