загрузка изображений с использованием библиотеки curl в цикле данных - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь загрузить изображения видов птиц, которые я изучаю, из формы Google (на самом деле лист ответов из этой формы). В этом сокращенном наборе данных у меня есть ID каждой птицы, дата, когда она была захвачена, и несколько изображений птицы с разных точек зрения (tail, frontPop и т. Д.).

Я бы хотел просмотреть этот набор данных, загрузить каждый тип изображения и назвать его по идентификатору птицы, дате захвата и типу изображения (что соответствует имени столбца):

189307140_2019-01-14_tail.jpg

Я могу использовать пакет 'curl' для загрузки изображения с каждой ссылки на Google Диск в электронной таблице, например:

library(curl)
curl_download(url = 'https://drive.google.com/uc?export=download&id=1kra8bSf4WMpoK8BTyFip2OxmUuz30Thl', 
              destfile = 'bird.jpg')

Но я застрял на более элегантном способе сделать это в цикле (по каждой птице и типу фотографии в моем наборе данных) ...

Вот пример данных:

dat <- structure(list(markerID = c(189307136L, 189307145L, 183337360L
), date = structure(c(17907, 17910, 17910), class = "Date"), 
    tail = c("https://drive.google.com/uc?export=download&id=13S9s_j6acfndEz4HbpG-v2ZRyT8LLgji", 
    "https://drive.google.com/uc?export=download&id=19XpBTLws94wtCtgPF6oXKM_GZ_cV4oMf", 
    "https://drive.google.com/uc?export=download&id=1I5zA8tJdEv26EzI9rwBSN5tVsASyT4Cl"
    ), frontPop = c("https://drive.google.com/uc?export=download&id=1lJgl3hin9sWQcV40aJgdYPQM6jzch2Lb", 
    "https://drive.google.com/uc?export=download&id=1QdB1KmyHrlKkTlux0fkyI1Aw-Pe15sYF", 
    "https://drive.google.com/uc?export=download&id=1xqNT9CPVfMj2ksxqMONGbWXyJKaKtLuR"
    ), backPop = c("https://drive.google.com/uc?export=download&id=1YAe4S7_LIrLsbOW2qCBuWjyOr_SgT54T", 
    "https://drive.google.com/uc?export=download&id=1QOC8rPDjWfy6PVSaXFycf4jDyUnV-Vbv", 
    "https://drive.google.com/uc?export=download&id=1Gyo4lXgp0nXbsdd0jA_kk1m2jW8RGGIY"
    )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-3L))

    # A tibble: 3 x 5
   markerID date       tail                                         frontPop                                     backPop                                     
      <int> <date>     <chr>                                        <chr>                                        <chr>                                       
1 189307136 2019-01-11 https://drive.google.com/uc?export=download… https://drive.google.com/uc?export=download… https://drive.google.com/uc?export=download…
2 189307145 2019-01-14 https://drive.google.com/uc?export=download… https://drive.google.com/uc?export=download… https://drive.google.com/uc?export=download…
3 183337360 2019-01-14 https://drive.google.com/uc?export=download… https://drive.google.com/uc?export=download… https://drive.google.com/uc?export=download…

1 Ответ

0 голосов
/ 19 января 2019

Вот элегантный способ решить вашу проблему, используя library(purrr):

library(tidyverse)
library(curl)

dat <- structure(
  list(markerID = c(189307136L, 189307145L, 183337360L), 
       date = structure(c(17907, 17910, 17910), class = "Date"), 
       tail = c("https://drive.google.com/uc?export=download&id=13S9s_j6acfndEz4HbpG-v2ZRyT8LLgji", 
                "https://drive.google.com/uc?export=download&id=19XpBTLws94wtCtgPF6oXKM_GZ_cV4oMf", 
                "https://drive.google.com/uc?export=download&id=1I5zA8tJdEv26EzI9rwBSN5tVsASyT4Cl"), 
       frontPop = c("https://drive.google.com/uc?export=download&id=1lJgl3hin9sWQcV40aJgdYPQM6jzch2Lb", 
                    "https://drive.google.com/uc?export=download&id=1QdB1KmyHrlKkTlux0fkyI1Aw-Pe15sYF", 
                    "https://drive.google.com/uc?export=download&id=1xqNT9CPVfMj2ksxqMONGbWXyJKaKtLuR"), 
       backPop = c("https://drive.google.com/uc?export=download&id=1YAe4S7_LIrLsbOW2qCBuWjyOr_SgT54T", 
                   "https://drive.google.com/uc?export=download&id=1QOC8rPDjWfy6PVSaXFycf4jDyUnV-Vbv", 
                   "https://drive.google.com/uc?export=download&id=1Gyo4lXgp0nXbsdd0jA_kk1m2jW8RGGIY")), 
  class = c("tbl_df", "tbl", "data.frame"), 
  row.names = c(NA, -3L))

read_and_title <- as_mapper(~curl_download(url = ..4, 
                                           destfile = paste0(..1,"_",..2,"_",..3,".png")))

dat %>% 
  gather(key = "photo_type", value = "url", 3:5) %>% 
  pmap_chr(read_and_title)
#> [1] "189307136_17907_tail.png"     "189307145_17910_tail.png"    
#> [3] "183337360_17910_tail.png"     "189307136_17907_frontPop.png"
#> [5] "189307145_17910_frontPop.png" "183337360_17910_frontPop.png"
#> [7] "189307136_17907_backPop.png"  "189307145_17910_backPop.png" 
#> [9] "183337360_17910_backPop.png"

Создано в 2019-01-18 пакетом Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...