gregexpr
возвращает список, содержащий вектор с некоторыми дополнительными данными:
[[1]]
[1] 21 136 409 512 587 693
attr(,"match.length")
[1] 3 4 5 5 4 9
Как извлечь сразу только один элемент с соответствующим атрибутом?
[[1]]
[1] 409
attr(,"match.length")
[1] 5
UPD: Конечный объект должен быть совместим с функцией regmatches
.
Мы можем сделать
out <- lapply(lst1, `[`, 3)
attr(out, "match.length") <- attr(lst1, "match.length")[3]
-вывод
> out
[[1]]
[1] 409
attr(,"match.length")
[1] 5
lst1 <- structure(list(c(21, 136, 409, 512, 587, 693)),
match.length = c(3,
4, 5, 5, 4, 9))
Одно отличие состоит в том, что gregexpr
помещает атрибут в элементы списка, а не в сам список.
В общем, R не может узнать, что элементы вектора соответствуют 1-1 элементам одного из его атрибутов.
Если вы знаете, что это правда (как в случае с результатами gregexpr
), то способ сообщить R об этом — установить класс для объекта и написать свой собственный код подмножества. Например,
`[.gregexpr_result` <- function(x, i) {
attrs <- lapply(x, function(element) {
allattrs <- attributes(element)
allattrs[["match.length"]] <- allattrs[["match.length"]][i]
allattrs
})
x <- lapply(x, `[`, i)
for (j in seq_along(x))
attributes(x[[j]]) <- attrs[[j]]
x
}
x <- paste(letters[1:2], letters[1:2])
result <- gregexpr("b", x)
class(result) <- "gregexpr_result"
result
#> [[1]]
#> [1] -1
#> attr(,"match.length")
#> [1] -1
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
#>
#> [[2]]
#> [1] 1 3
#> attr(,"match.length")
#> [1] 1 1
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
#>
#> attr(,"class")
#> [1] "gregexpr_result"
result[2]
#> [[1]]
#> [1] NA
#> attr(,"match.length")
#> [1] NA
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
#>
#> [[2]]
#> [1] 3
#> attr(,"match.length")
#> [1] 1
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
Created on 2022-11-20 with reprex v2.0.2
Спасибо. Где узнать больше о синтаксисе вроде `[.gregexpr_result` <-
?
Честно говоря, у меня есть небольшое представление о том, что происходит в приведенном выше коде...
Вы можете прочитать об этом в «Определении языка R», раздел 5.4, но многие люди находят это руководство непрозрачным и считают «Расширенный R» Хэдли Уикхема более понятным. См. adv-r.hadley.nz/s3.html.
Если вы прочитаете книгу Advanced R полностью, вы, вероятно, поймете код, но более быстрое решение — перестать читать мой ответ после первого абзаца. То, что вы хотите сделать, трудно.
Боюсь,
lst1
— это не тот объект с той же структурой, который возвращаетgregexpr
. Его нельзя использовать с функциейregmatches
.