Есть ли способ, которым я мог бы использовать вектор вместо этого для l oop? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь l oop через кучу файлов в R и получить доступ к информации в каждом. Излишне говорить, что l oop невыносимо медленный. Есть ли способ, которым я мог бы векторизовать это?

library("rjson")

all_files=list.files(path="~/p/a/t/h", recursive = TRUE)

for(i in seq_along(all_files)) {
    temp = fromJSON(file = all_files[i])
    if (length(temp$tags) != 0){
        songTags <- c(songTags, temp$tags)
        songTrack_id <- c(songTrack_id, temp$track_id)
    }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Не проверено:

rawdat <- lapply(all_files, fromJSON)
hastags <- sapply(rawdat, function(x) "tags" %in% names(rawdat))
if (any(hastags)) {
  songTags <- unlist(lapply(rawdat[hastags], `[[`, "tags"))
  songTracks <- unlist(lapply(rawdat[hastags], `[[`, "track_id"))
}
0 голосов
/ 28 апреля 2020

Рост объектов в al oop обычно очень дорогой / медленный. Вы можете использовать lapply / sapply.

all_data <- do.call(rbind, lapply(all_files, function(x) {
                temp = jsonlite::fromJSON(file = x)
                if(length(temp$tags)) 
                   list(tags = temp$tags, track_id = temp$track_id)
            }))

Или более короткий вариант с использованием purrr s map_df

all_data <- map_df(all_files, ~{
               temp = jsonlite::fromJSON(file = .x)
               if(length(temp$tags)) 
                  list(tags = temp$tags, track_id = temp$track_id)
               })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...