On occasion of the 10,000th R package on CRAN, eoda operated an automated Twitter account which regularly posted the current number of packages available on CRAN until the 10,000-package milestone has been passed on January 28, 2017.
#Rstatsgoes10k – Hello World, it’s 2017-01-28 01:59:03 and currently there are 10000 packages on CRAN.
— eodacelebratesR (@Rstatsgoes10k) 28. Januar 2017
To operate this account, we wrote an R script for reading the current number of R packages on CRAN every hour and automatically sending a Tweet with the status quo. All we needed to make this work was the Twitter API as well as the twitteR package.
For using the Twitter API, it is necessary to create a corresponding app for the Twitter account.
For this, log in with the respective account on apps.twitter.com and fill out the form under Create New App.
In the next window, you can set among other things the permissions of the app, “read only”, “read and write” or “read, write and access direct messages”. To operate the app, you also need the Consumer Key and Consumer Secret as well as the Access Token and Access Token Secret you can find in the tab Key and Access Tokens.
We transferred this information into an extra file in order to be able to load them into the R script later on. Now the app is ready for use.
For sending Tweets out of R, you need the functions setup_twitter_oauth and tweet from the twitter package. The function setup_twitter_oauth manages the authentication and tweet finally sends the appropriate Tweet.
The following R script demonstrates how we applied this to our Rstatsgoes10k account:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# Packages —————————————————————-
library(rvest)
library(stringr)
library(dplyr)
library(twitteR)
# get number of packages ————————————————–
url < – “https://cran.r-project.org/web/packages/”
page <– read_html(url)
n_packages <– page %>%
html_text() %>%
str_extract(“[[:digit:]]* available packages”) %>%
str_extract(“[[:digit:]]*”) %>%
as.numeric()
n_packages_last_time < – read.table(file = “n_packages.csv”,stringsAsFactors = F, sep = “;”)
n_packages_last_time <– n_packages_last_time$V2[nrow(n_packages_last_time)] ## check if news packages are published, new tweet only when number of packages changed if(n_packages > n_packages_last_time) {
# Twitter —————————————————————–
# set up twitter api
api_keys < – read.csv2(“twitter_access.csv”, stringsAsFactors = FALSE)
setup_twitter_oauth(consumer_key = api_keys$consumer_key,
consumer_secret = api_keys$consumer_secret,
access_token = api_keys$access_token,
access_secret = api_keys$access_secret)
time <– Sys.time()
# create tweet
tweet_text <– paste0(“#Rstatsgoes10k – Hello World, it’s “, time, ” and currently there are “, n_packages, ” packages on CRAN. “)
# send tweet
tweet(tweet_text)
# write n to file ———————————————————
n_packages_df <– data.frame(time = Sys.time(), n = n_packages)
write.table(n_packages_df, file = “n_packages.csv”, row.names = FALSE,col.names = FALSE,
append = TRUE, sep = “;”)
}
|
Good luck with the implementation.