@uri さんのこれだけど
添削希望??みたいなのでやってみます。
screen.name <- html("https://twitter.com/teramonagi/lists/list/members") %>%
html_nodes(css = ".username") %>%
html_text() %>%
unique() %>%
grep(pattern = "^[[:punct:]][[:graph:]]", value = TRUE) %>%
substr(2, 100)
screen.name
screen.name <- html("https://twitter.com/teramonagi/lists/list/members") %>%
html_nodes(xpath = '//*[@id="stream-items-id"]/li/div/div[2]/div/a/span[1]') %>%
html_text %>%
substring(2)
screen.name
ちゃんとスクレイピングすれば変に grep とかやらないで済みます。
for(i in 1:length(screen.name)){
html(paste("https://twitter.com/", screen.name[i], sep = "")) %>%
html_nodes(css = ".ProfileAvatar-image") %>%
html_attr("src") %>%
download.file(destfile = paste("img_hxm/", screen.name[i], "_", basename(.), sep = ""), method = "curl")
}
# 親分へ。これをpfroeachでやるにはどうすればよいでしょうか...
## 失敗例
# pforeach(i in 1:length(screen.name))({
# html(paste("https://twitter.com/", screen.name[i], sep = "")) %>%
# html_nodes(css = ".ProfileAvatar-image") %>%
# html_attr("src") %>%
# download.file(destfile = paste("img_hxm/", basename(.), sep = ""), method = "curl")
# })
npforeach(id = screen.name)({
cat(id, "\n")
url <- sprintf("https://twitter.com/%s", id)
img_url <- html(url) %>%
html_nodes(css = ".ProfileAvatar-image") %>%
html_attr("src")
destfile <- file.path("img_hxm", sprintf("%s_%s", id, basename(img_url)))
img_url %>% download.file(destfile = destfile, mode="wb")
invisible()
})
pforeach では in でなく = を使います。
これぐらいだと並列処理するほうがコストがかかると思うので npforeach を使ってます。
好みの問題ですが、paste より sprintf を使ったほうがすっきりします。
どうしても paste を使いたい場合は paste0 を使うのが便利かと。
prof.file <- list.files(path = "img_hxm")
pal <- extract_colours(url_img = paste("img_hxm/", prof.file[15], sep = ""))
pal
prof.file <- list.files("img_hxm", full.names = TRUE, pattern = sprintf("^%s", screen.name[15]))
pal <- extract_colours(url_img = prof.file)
pal
list.files には full.names という引数があります。
また、screen.name と prof.file の順番が必ずしも対応するわけではないため、pattern 引数で目的の ID から始まるファイルを指定してやります。
data.frame(name = rep(screen.name[15], each = 5), value = rep(20, 5), pal) %>%
ggplot(., aes(x ="", y = value, fill = pal)) +
geom_bar(stat = "identity") + coord_polar("y") +
scale_fill_manual(values = pal) +
guides(fill = FALSE)
data <- data.frame(name = screen.name[15], value = 100/length(pal), pal)
ggplot(data, aes(x ="", y = value, fill = pal)) +
geom_bar(stat = "identity") + coord_polar("y") +
scale_fill_manual(values = pal) +
guides(fill = FALSE)
わざわざ rep とかしなくても長いほうに合わせてくれます。
好みの問題だけど、パイプと ggplot は分けたほうが良いのでは。
rPlotter 入れるの面倒くさそうだったので実行はしてません。
ところで screen.name[15] は dichika さんみたいだけど、screen.name[14] のまちがい?
Enjoy!