Как уже отмечалось, vapply
выполняет две функции:
Второй момент - большее преимущество, поскольку он помогает ловить ошибки до их возникновения и приводит к более надежному коду. Эта проверка возвращаемого значения может быть сделана отдельно с помощью sapply
, а затем stopifnot
, чтобы убедиться, что возвращаемые значения соответствуют ожидаемым, но vapply
немного проще (если они более ограничены, так как пользовательский код проверки ошибок может проверять значения в пределах границ и т. д.).
Вот пример vapply
, гарантирующий, что ваш результат будет таким, как ожидалось. Это сравнивает то, над чем я только что работал, в то время как PDF-скребок, где findD
использовал regex для соответствия шаблону в необработанных текстовых данных (например, у меня был бы список, который был 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)
[/g1]
Был бы это (документы API мерзавца) быть какой-либо справки?
Вот список ресурсов о расширении php (т.е. к обеспечить обертки вокруг другого кода библиотеки):
кроме того, они казались бы релевантными, также:
Можно также хотеть проверить проект Cgit, так как они сделали что-то подобное (кроме, они создают свою собственную библиотеку мерзавца - также, чтобы не работать git
непосредственно).
существует JGit, чистая реализация Java, которая может быть полезна для Вас.
Я думаю, что лучше всего запускаются в таком случае, могла быть страница Interfaces Frontends And Tools на Мерзавце Wiki.
Можно найти там ссылку на eWiki (github), который, предположительно, использует собственный компонент (в PHP) доступ к Мерзавцу.