удалить последний элемент вектора

Как упоминалось в более раннем ответе, это поведение известно как с именем access по объекту window . Значение атрибута name для некоторых элементов и значение атрибута id для всех элементов становятся доступными как свойства глобального объекта window. Они известны как именованные элементы. Поскольку window является глобальным объектом в браузере, каждый именованный элемент будет доступен как глобальная переменная.

Это было первоначально добавлено Internet Explorer и в конечном итоге было реализовано всеми другими браузерами просто для совместимости с сайтами которые зависят от этого поведения. Интересно, что Gecko (движок рендеринга Firefox) решил реализовать это только в режиме quirks , тогда как другие механизмы рендеринга оставили его в стандартном режиме.

Однако, с Firefox 14, Firefox теперь поддерживает именованный доступ к объекту window в стандартном режиме. Почему они изменили это? Оказывается, все еще есть много сайтов, которые полагаются на эту функциональность в стандартном режиме. Microsoft даже выпустила маркетинговую демонстрацию , которая предотвратила демонстрацию работы в Firefox.

Недавно Webkit рассмотрел противоположное , отменив именованный доступ на window объект только для режима quirks. Они решили против этого по тем же соображениям, что и Гекко.

Итак ... сумасшедший, поскольку кажется, что это поведение теперь технически безопасно использовать в последней версии всех основных браузеров в стандартном режиме. Но хотя названный доступ может показаться несколько удобным, его не следует использовать.

Почему? В этой статье можно суммировать рассуждения о том, почему глобальные переменные являются плохими . Проще говоря, наличие множества дополнительных глобальных переменных приводит к большему количеству ошибок. Допустим, вы случайно набрали имя var и случайно набрали id узла DOM, SURPRISE!

Кроме того, несмотря на стандартизацию, все еще существует довольно много несоответствий в реализациях браузера именованный доступ.

И я уверен, что есть больше, если вы попробуете использовать именованный доступ в случаях с краем.

Как упоминалось в других ответах, используйте document.getElementById, чтобы получить ссылку на узел DOM своим id. Если вам нужно получить ссылку на узел по его атрибуту name, используйте document.querySelectorAll.

Пожалуйста, не распространяйте эту проблему, используя именованный доступ на вашем сайте. Так много веб-разработчиков потратили время, пытаясь отследить это магическое поведение . Нам действительно нужно принять меры и заставить механизмы рендеринга отключить именованный доступ в стандартном режиме. В краткосрочной перспективе это сломает некоторые сайты, делающие плохие вещи, но в конечном итоге это поможет переместить веб-сайт.

Если вам интересно, я более подробно расскажу об этом в своем блоге - http://tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .

29
задан Gregor 3 May 2016 в 20:53
поделиться

4 ответа

Вы можете использовать отрицательные смещения в head (или tail), поэтому head(x, -1) удаляет последний последний элемент :

R> head( 1:4, -1)
[1] 1 2 3
R> 

Это также сохраняет дополнительный вызов length().

Редактировать: Как отметил Джейсон, этот подход на самом деле не быстрее. Не могу поспорить с эмпирикой. На моей машине:

R> x <- rnorm(1000)
R> microbenchmark( y <- head(x, -1), y <- x[-length(x)], times=10000)
Unit: microseconds
                expr    min      lq median     uq     max
1   y <- head(x, -1) 29.412 31.0385 31.713 32.578 872.168
2 y <- x[-length(x)] 14.703 15.1150 15.565 15.955 706.880
R> 
63
ответ дан Dirk Eddelbuettel 3 May 2016 в 20:53
поделиться

Используйте длину, чтобы получить длину объекта и -, чтобы удалить последний.

v[-length(v)]

Отрицательный индекс в R извлекает все , но данные индексы.

25
ответ дан Paul Hiemstra 3 May 2016 в 20:53
поделиться

Дирк и Изельзер уже предоставили ответы. Дирка, безусловно, самый простой, но в моей системе, по крайней мере, он немного медленнее, вероятно, потому что поднабор векторов с проверкой [ и length дешев (и, согласно источнику, head использует length, дважды на самом деле):

> x <- rnorm(1000)
> system.time(replicate(50000, y <- head(x, -1)))
   user  system elapsed 
   3.69    0.56    4.25 
> system.time(replicate(50000, y <- x[-length(x)]))
   user  system elapsed 
  3.504   0.552   4.058

Этот шаблон поддерживается для больших длин векторов и большего количества повторений. YMMV. Разборчивость head, безусловно, превосходит предельное улучшение производительности [ в большинстве случаев.

8
ответ дан Jason Morgan 3 May 2016 в 20:53
поделиться

Это еще один вариант, который не был предложен ранее. NROW рассматривает ваш вектор как матрицу из 1 столбца.

v[-max(NROW(v))]#1 2
v1[-max(NROW(v1))]#4 5 6 7

Исходя из вышеизложенного, это (немного) быстрее, чем все другие предложенные методы:

x <- rnorm(1000)
system.time(replicate(50000, y <- head(x, -1)))
user  system elapsed 
3.446   0.292   3.762
system.time(replicate(50000, y <- x[-length(x)]))
user  system elapsed 
2.131   0.326   2.472
system.time(replicate(50000, y <- x[-max(NROW(x))]))
user  system elapsed 
2.076   0.262   2.342
3
ответ дан Elin 3 May 2016 в 20:53
поделиться
Другие вопросы по тегам:

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