Что так плохо о xsl:for-каждом?

Мы можем циклически проходить по строкам с помощью apply (из base R) проверить, являются ли any элементов в 'a' или 'b' %in% группой sort ed для создания логического индекса и подмножество строк на основе этого

i1 <- apply(my.df, 1, function(x) any(x[1:2] %in% sort(x, decreasing = TRUE)[1:2]))
my.df[i1,]
#         a        b        c        d        e
#1  6.401462 5.318849 5.373496 5.101140 3.710973
#2  6.715845 4.786936 3.521965 4.264029 4.525138
#3  6.076211 5.356114 5.605134 5.443002 5.296778
#4  7.009623 5.275595 4.801874 4.355892 6.752737
#5  5.002059 6.163398 6.063694 2.409702 6.172111
#6  6.298305 3.291884 5.737053 4.701320 4.752406
#10 5.500374 4.400130 3.980433 6.203259 4.498614

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

i1 <- max.col(my.df, "first")
i2 <- max.col(replace(my.df, cbind(seq_len(nrow(my.df)), i1), -Inf), "first")
my.df[(i1 %in% 1:2) | (i2 %in% 1:2), ]
[ 1110] данные

my.df <- structure(list(a = c(6.401462, 6.715845, 6.076211, 7.009623, 
5.002059, 6.298305, 4.856246, 5.03799, 4.903592, 5.500374), b = c(5.318849, 
4.786936, 5.356114, 5.275595, 6.163398, 3.291884, 4.674743, 4.129333, 
3.135622, 4.40013), c = c(5.373496, 3.521965, 5.605134, 4.801874, 
6.063694, 5.737053, 5.550828, 4.797334, 5.879798, 3.980433), 
    d = c(5.10114, 4.264029, 5.443002, 4.355892, 2.409702, 4.70132, 
    7.501786, 5.143915, 5.639893, 6.203259), e = c(3.710973, 
    4.525138, 5.296778, 6.752737, 6.172111, 4.752406, 5.466611, 
    5.558161, 4.368915, 4.498614)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

6
задан eddiegroves 10 April 2009 в 10:36
поделиться

5 ответов

Существенная разница между и , на которую никто не указал :

  1. - это нечто гораздо большее, чем более приятный и элегантный эквивалент :

xsl: apply-templates гораздо богаче и глубже, чем xsl: for-each , даже просто потому, что мы не знаем, какой код будет применяться к узлам выбор - в общем случае этот код будет отличаться для разные узлы списка узлов .

Кроме того, код, который будет применяться может быть написано так, как шаблоны xsl: apply были написаны и люди, которые не знают оригинального автора .


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

Проблема в том, что многие новички в XSLT, имеющие опыт в императивном программировании, принимают в качестве замены «цикла» в своих любимых PL и думают, что это позволяет их выполнить невозможно - например, увеличить счетчик или любую другую модификацию уже определенного .

Одно обязательное использование для изменения текущего документа - это часто необходимо для того, чтобы иметь возможность использовать функцию key () в документе, отличную от текущего исходного XML-документа ,

6
ответ дан 8 December 2019 в 14:47
поделиться

Это использование для каждого для вызова шаблонов, которое не рекомендуется, а не широкое использование для каждого как таковое. Даже мюнхенский метод группировки опирается на конструкции xsl: key с циклами xsl: for-each .

Идея написания хорошего XSLT состоит в том, что Структура вашего XML должна определять, какие шаблоны сопоставляются, а затем применяются. Поэтому, когда это возможно, используйте apply-templates для выбора узлов, вместо применения выбора, используя для каждого .

2
ответ дан 8 December 2019 в 14:47
поделиться

Шаблоны имеют тенденцию делить код более красиво. Кроме того, циклы for-each страдают от того, что люди часто приходят к ним с мыслью, что они действуют идентично тому, как работают циклы в основных языках программирования.

5
ответ дан 8 December 2019 в 14:47
поделиться

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

Например, если у вас был XML, содержащий содержимое библиотеки, и вы продолжаете использовать for-each повсеместно для выбора книг, тогда Вы начнете вести учет DVD, CD, печенья с имбирным орехом и т. д., вам придется изучить все разделы для каждого, чтобы включить в них больше, чем просто книги. Если вы использовали apply-templates, вы можете просто создать новые соответствия для новых элементов.

1
ответ дан 8 December 2019 в 14:47
поделиться

Быстрый ответ: XSLT в основном функционален по своей природе, а императивные петли не очень функциональны.

В общем, Основанный способ получить лучшее из XSLT - максимально использовать сопоставление с образцом ( xsl: apply-template , а не циклы, ifs и call-template 1 ).

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

1 За исключением случаев создания функций, которые скорее возвращают значения чем модифицировать вывод.

2
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

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