Чтение репозитория Мерзавца, без Мерзавца

Как уже отмечалось, vapply выполняет две функции:

  • Улучшение медленной скорости
  • Улучшает согласованность, обеспечивая ограниченную проверку типа возврата.

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

Вот пример vapply, гарантирующий, что ваш результат будет таким, как ожидалось. Это сравнивает то, над чем я только что работал, в то время как PDF-скребок, где findD использовал для соответствия шаблону в необработанных текстовых данных (например, у меня был бы список, который был split сущностью , и регулярное выражение для соответствия адресам внутри каждого объекта. Иногда PDF-код был преобразован вне порядка, и для объекта было бы два адреса, что вызвало нехорошее состояние.)

> input1 <- list( letters[1:5], letters[3:12], letters[c(5,2,4,7,1)] )
> input2 <- list( letters[1:5], letters[3:12], letters[c(2,5,4,7,15,4)] )
> findD <- function(x) x[x=="d"]
> sapply(input1, findD )
[1] "d" "d" "d"
> sapply(input2, findD )
[[1]]
[1] "d"

[[2]]
[1] "d"

[[3]]
[1] "d" "d"

> vapply(input1, findD, "" )
[1] "d" "d" "d"
> vapply(input2, findD, "" )
Error in vapply(input2, findD, "") : values must be length 1,
 but FUN(X[[3]]) result is length 2

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

Входы нулевой длины Одна связанная точка состоит в том, что если входная длина равна нулю, sapply всегда будет возвращать пустой список, независимо от типа ввода. Сравнение:

sapply(1:5, identity)
## [1] 1 2 3 4 5
sapply(integer(), identity)
## list()    
vapply(1:5, identity)
## [1] 1 2 3 4 5
vapply(integer(), identity)
## integer(0)

С помощью vapply вы гарантированно получите определенный тип вывода, поэтому вам не нужно писать дополнительные проверки на входы с нулевой длиной.

Тесты

vapply могут быть немного быстрее, потому что он уже знает, в каком формате он должен ожидать результатов.

input1.long <- rep(input1,10000)

library(microbenchmark)
m <- microbenchmark(
  sapply(input1.long, findD ),
  vapply(input1.long, findD, "" )
)
library(ggplot2)
library(taRifx) # autoplot.microbenchmark is moving to the microbenchmark package in the next release so this should be unnecessary soon
autoplot(m)

autoplot [/g1]

25
задан ANaimi 14 March 2009 в 12:05
поделиться

3 ответа

Можно также хотеть проверить проект Cgit, так как они сделали что-то подобное (кроме, они создают свою собственную библиотеку мерзавца - также, чтобы не работать git непосредственно).

существует JGit, чистая реализация Java, которая может быть полезна для Вас.

7
ответ дан Pat Notz 15 October 2019 в 17:06
поделиться

Я думаю, что лучше всего запускаются в таком случае, могла быть страница Interfaces Frontends And Tools на Мерзавце Wiki.
Можно найти там ссылку на eWiki (github), который, предположительно, использует собственный компонент (в PHP) доступ к Мерзавцу.

2
ответ дан Jakub Narębski 28 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

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