

{"id":6788,"date":"2017-10-22T13:11:09","date_gmt":"2017-10-22T18:11:09","guid":{"rendered":"https:\/\/rud.is\/b\/?p=6788"},"modified":"2018-03-10T07:54:16","modified_gmt":"2018-03-10T12:54:16","slug":"a-call-to-tweets-blog-posts","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/","title":{"rendered":"A Call to Tweets (&#038; Blog Posts)!"},"content":{"rendered":"<p>Way back in July of 2009, the first version of the <code>twitteR<\/code> package was published by <a href=\"https:\/\/github.com\/geoffjentry\/twitteR\">Geoff Jentry<\/a> in CRAN. Since then it has seen 28 updates, finally breaking the 0.x.y barrier into 1.x.y territory in March of 2013 and receiving it&#8217;s last update in July of 2015.<\/p>\n<p>For a very long time, the <code>twitteR<\/code> package was <em>the way<\/em> to siphon precious nuggets of 140 character data from that platform and is the top hit when one searches for <a href=\"https:\/\/www.google.com\/search?q=r+twitter+package\"><code>r twitter package<\/code><\/a>. It even ha&#091;sd] it&#8217;s own <a href=\"http:\/\/lists.hexdump.org\/pipermail\/twitter-users-hexdump.org\/\">mailing list<\/a> and is quite popular, judging by RStudio&#8217;s CRAN logs total downloads stats <img decoding=\"async\" src=\"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR\" alt=\"\" \/>.<\/p>\n<p>I blog today to suggest there is a better way to work with Twitter data from R, especially if your central use-case is searching Twitter and mining tweet data. This new way is <a href=\"https:\/\/cran.rstudio.com\/web\/packages\/rtweet\/\"><code>rtweet<\/code><\/a> by <a href=\"https:\/\/github.com\/mkearney\/rtweet\/\">Michael Kearney<\/a>. It popped up on the scene back in August of 2016 and receives quite a bit of ? from the developer, especially <a href=\"https:\/\/github.com\/mkearney\/rtweet\/\">on GitHub<\/a>.<\/p>\n<p>This post is short and mostly designed to convince you to (a) try out the package and (b) blog and tweet about the package &#8212; if you do agree that it&#8217;s the best modern way to work with Twitter from R &#8212; to raise awareness about it. Because of that focus, I won&#8217;t be delving into all of <code>rtweet<\/code>&#8216;s seekrits, but you can explore them yourself on it&#8217;s spiffy <a href=\"http:\/\/rtweet.info\/\">pkgdown site<\/a>.<\/p>\n<p>While both packages have nigh complete access to the Twitter API, I posit that the quintessential use-case for working with Twitter in R is searching through tweets\/users and then performing various types of data mining on the retrieved results. To that end, I&#8217;m going to show one use-case (out of many potential ones) that will both save you API-time and post-API munging time in order to convince you to switch to <code>rtweet<\/code> and spread the word about it.<\/p>\n<h3>Data-mining 300 <code>#rstats<\/code> Tweets : A Play in Two Acts<\/h3>\n<p>We&#8217;ll search Twitter for <code>#rstats<\/code>-tagged tweets with both <code>twitteR<\/code> and <code>rtweet<\/code>, starting with the former:<\/p>\n<pre id=\"rtweet01\"><code class=\"language-r\">library(twitteR)\r\n\r\n# this relies on you setting up an app in apps.twitter.com\r\nsetup_twitter_oauth(\r\n  consumer_key = Sys.getenv(&quot;TWITTER_CONSUMER_KEY&quot;), \r\n  consumer_secret = Sys.getenv(&quot;TWITTER_CONSUMER_SECRET&quot;)\r\n)\r\n\r\nr_folks &lt;- searchTwitter(&quot;#rstats&quot;, n=300)\r\n\r\nstr(r_folks, 1)\r\n## List of 300\r\n##  $ :Reference class &#039;status&#039; [package &quot;twitteR&quot;] with 17 fields\r\n##   ..and 53 methods, of which 39 are  possibly relevant\r\n##  $ :Reference class &#039;status&#039; [package &quot;twitteR&quot;] with 17 fields\r\n##   ..and 53 methods, of which 39 are  possibly relevant\r\n##  $ :Reference class &#039;status&#039; [package &quot;twitteR&quot;] with 17 fields\r\n##   ..and 53 methods, of which 39 are  possibly relevant\r\n\r\nstr(r_folks[1])\r\n## List of 1\r\n##  $ :Reference class &#039;status&#039; [package &quot;twitteR&quot;] with 17 fields\r\n##   ..$ text         : chr &quot;RT @historying: Wow. This is an enormously helpful tutorial by @vivalosburros for anyone interested in mapping &quot;| __truncated__\r\n##   ..$ favorited    : logi FALSE\r\n##   ..$ favoriteCount: num 0\r\n##   ..$ replyToSN    : chr(0) \r\n##   ..$ created      : POSIXct[1:1], format: &quot;2017-10-22 17:18:31&quot;\r\n##   ..$ truncated    : logi FALSE\r\n##   ..$ replyToSID   : chr(0) \r\n##   ..$ id           : chr &quot;922150185916157952&quot;\r\n##   ..$ replyToUID   : chr(0) \r\n##   ..$ statusSource : chr &quot;&lt;a href=\\&quot;http:\/\/twitter.com\/download\/android\\&quot; rel=\\&quot;nofollow\\&quot;&gt;Twitter for Android&lt;\/a&gt;&quot;\r\n##   ..$ screenName   : chr &quot;jasonrhody&quot;\r\n##   ..$ retweetCount : num 3\r\n##   ..$ isRetweet    : logi TRUE\r\n##   ..$ retweeted    : logi FALSE\r\n##   ..$ longitude    : chr(0) \r\n##   ..$ latitude     : chr(0) \r\n##   ..$ urls         :&#039;data.frame&#039;: 0 obs. of  4 variables:\r\n##   .. ..$ url         : chr(0) \r\n##   .. ..$ expanded_url: chr(0) \r\n##   .. ..$ dispaly_url : chr(0) \r\n##   .. ..$ indices     : num(0) \r\n##   ..and 53 methods, of which 39 are  possibly relevant:\r\n##   ..  getCreated, getFavoriteCount, getFavorited, getId, getIsRetweet, getLatitude, getLongitude, getReplyToSID,\r\n##   ..  getReplyToSN, getReplyToUID, getRetweetCount, getRetweeted, getRetweeters, getRetweets, getScreenName,\r\n##   ..  getStatusSource, getText, getTruncated, getUrls, initialize, setCreated, setFavoriteCount, setFavorited, setId,\r\n##   ..  setIsRetweet, setLatitude, setLongitude, setReplyToSID, setReplyToSN, setReplyToUID, setRetweetCount,\r\n##   ..  setRetweeted, setScreenName, setStatusSource, setText, setTruncated, setUrls, toDataFrame, toDataFrame#twitterObj<\/code><\/pre>\n<p>Both packages follow the similar idioms and you need to have done some prep-work by creating a Twitter &#8220;app&#8221; (both packages have instructions for that).<\/p>\n<p>That operation took about 3 seconds on a fast internet connection and wicked fast computer. What you get back is definitely usable data, but it&#8217;s in lists of custom objects. This is due to the way that package models the Twitter API on to custom R objects. It&#8217;s elegant, but also likely overkill for most operations. You can use something like <code>purrr::map_df(r_folks, as.data.frame)<\/code> to get that list into a data frame, there are some other &#8220;gotchas&#8221;, such as text encoding (on a later run of this code both <code>dplyr::glimpse()<\/code> and <code>str()<\/code> gave me <em>&#8220;invalid multibyte string&#8221;<\/em> errors but that same thing did not happen with <code>rtweet<\/code>.<\/p>\n<p>Here&#8217;s the <code>rtweet<\/code> version:<\/p>\n<pre id=\"rtweet02\"><code class=\"language-r\">library(rtweet)\r\n\r\n# this relies on you setting up an app in apps.twitter.com\r\ncreate_token(\r\n  app = Sys.getenv(&quot;TWITTER_APP&quot;),\r\n  consumer_key = Sys.getenv(&quot;TWITTER_CONSUMER_KEY&quot;), \r\n  consumer_secret = Sys.getenv(&quot;TWITTER_CONSUMER_SECRET&quot;)\r\n) -&gt; twitter_token\r\n\r\nsaveRDS(twitter_token, &quot;~\/.rtweet-oauth.rds&quot;)\r\n\r\n# ideally put this in ~\/.Renviron\r\nSys.setenv(TWITTER_PAT=path.expand(&quot;~\/.rtweet-oauth.rds&quot;))\r\n\r\nrtweet_folks &lt;- search_tweets(&quot;#rstats&quot;, n=300)\r\n\r\ndplyr::glimpse(rtweet_folks)\r\n## Observations: 300\r\n## Variables: 35\r\n## $ screen_name                    &lt;chr&gt; &quot;AndySugs&quot;, &quot;jsbreker&quot;, &quot;__rahulgupta__&quot;, &quot;AndySugs&quot;, &quot;jasonrhody&quot;, &quot;sibanjan...\r\n## $ user_id                        &lt;chr&gt; &quot;230403822&quot;, &quot;703927710&quot;, &quot;752359265394909184&quot;, &quot;230403822&quot;, &quot;14184263&quot;, &quot;863...\r\n## $ created_at                     &lt;dttm&gt; 2017-10-22 17:23:13, 2017-10-22 17:19:48, 2017-10-22 17:19:39, 2017-10-22 17...\r\n## $ status_id                      &lt;chr&gt; &quot;922151366767906819&quot;, &quot;922150507745079297&quot;, &quot;922150470382125057&quot;, &quot;9221504090...\r\n## $ text                           &lt;chr&gt; &quot;RT:  (Rbloggers)Markets Performance after Election: Day 239  https:\/\/t.co\/D1...\r\n## $ retweet_count                  &lt;int&gt; 0, 0, 9, 0, 3, 1, 1, 57, 57, 103, 10, 10, 0, 0, 0, 34, 0, 0, 642, 34, 1, 1, 1...\r\n## $ favorite_count                 &lt;int&gt; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,...\r\n## $ is_quote_status                &lt;lgl&gt; FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ...\r\n## $ quote_status_id                &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ is_retweet                     &lt;lgl&gt; FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, F...\r\n## $ retweet_status_id              &lt;chr&gt; NA, NA, &quot;922085241493360642&quot;, NA, &quot;921782329936408576&quot;, &quot;922149318550843393&quot;,...\r\n## $ in_reply_to_status_status_id   &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ in_reply_to_status_user_id     &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ in_reply_to_status_screen_name &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ lang                           &lt;chr&gt; &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;en&quot;, &quot;ro&quot;,...\r\n## $ source                         &lt;chr&gt; &quot;IFTTT&quot;, &quot;Twitter for iPhone&quot;, &quot;GaggleAMP&quot;, &quot;IFTTT&quot;, &quot;Twitter for Android&quot;, &quot;...\r\n## $ media_id                       &lt;chr&gt; NA, &quot;922150500237062144&quot;, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, &quot;92...\r\n## $ media_url                      &lt;chr&gt; NA, &quot;http:\/\/pbs.twimg.com\/media\/DMwi_oQUMAAdx5A.jpg&quot;, NA, NA, NA, NA, NA, NA,...\r\n## $ media_url_expanded             &lt;chr&gt; NA, &quot;https:\/\/twitter.com\/jsbreker\/status\/922150507745079297\/photo\/1&quot;, NA, NA,...\r\n## $ urls                           &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ urls_display                   &lt;chr&gt; &quot;ift.tt\/2xe1xrR&quot;, NA, NA, &quot;ift.tt\/2xe1xrR&quot;, NA, &quot;bit.ly\/2yAAL0M&quot;, &quot;bit.ly\/2yA...\r\n## $ urls_expanded                  &lt;chr&gt; &quot;http:\/\/ift.tt\/2xe1xrR&quot;, NA, NA, &quot;http:\/\/ift.tt\/2xe1xrR&quot;, NA, &quot;http:\/\/bit.ly\/...\r\n## $ mentions_screen_name           &lt;chr&gt; NA, NA, &quot;DataRobot&quot;, NA, &quot;historying vivalosburros&quot;, &quot;NoorDinTech ikashnitsky...\r\n## $ mentions_user_id               &lt;chr&gt; NA, NA, &quot;622519917&quot;, NA, &quot;18521423 304837258&quot;, &quot;2511247075 739773414316118017...\r\n## $ symbols                        &lt;lgl&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ hashtags                       &lt;chr&gt; &quot;rstats DataScience&quot;, &quot;Rstats ACSmtg&quot;, &quot;rstats&quot;, &quot;rstats DataScience&quot;, &quot;rstat...\r\n## $ coordinates                    &lt;lgl&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ place_id                       &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ place_type                     &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ place_name                     &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ place_full_name                &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ country_code                   &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ country                        &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ bounding_box_coordinates       &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...\r\n## $ bounding_box_type              &lt;chr&gt; NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...<\/code><\/pre>\n<p>That took about 1.5 seconds and provides a tidy, immediately usable data structure.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/10\/tumblr_o0zyye9OQP1sztyb3o1_1280.jpg?ssl=1\"><img data-recalc-dims=\"1\" width=\"510\" decoding=\"async\" data-attachment-id=\"6793\" data-permalink=\"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/tumblr_o0zyye9oqp1sztyb3o1_1280\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/10\/tumblr_o0zyye9OQP1sztyb3o1_1280.jpg?fit=640%2C640&amp;ssl=1\" data-orig-size=\"640,640\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"tumblr_o0zyye9OQP1sztyb3o1_1280\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/10\/tumblr_o0zyye9OQP1sztyb3o1_1280.jpg?fit=510%2C510&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/10\/tumblr_o0zyye9OQP1sztyb3o1_1280.jpg?fit=510%2C64&#038;ssl=1\" alt=\"\" height=\"64\" class=\"aligncenter size-full wp-image-6793\" \/><\/a><\/p>\n<h3>But, that&#8217;s not all!<\/h3>\n<p>Michael has support for accessing the Twitter streaming API and also has some handy plot functions for quickly exploring retrieved Twitter content, enabling you to make pretty spiffy plots like this with <em>almost<\/em> no effort (this was pirated from Michael&#8217;s package website):<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/rtweet.info\/articles\/files\/stream-filter.png?w=510\" alt=\"\" \/><\/p>\n<h3>Fin<\/h3>\n<p>If the legacy <code>twitteR<\/code> package is already in your workflows, there may be little to gain. But, I would suggest that R folks give <code>rtweet<\/code> a try and blog about your experiences. It&#8217;ll give others a chance to see usage in different contacts and will also help spread the word about this alternative package and help bump up it&#8217;s pagerank.<\/p>\n<p>As I said on Twitter:<\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p lang=\"en\" dir=\"ltr\">rtweet is to Twitter+R as dplyr is to databases+R: the best modern way to access the data\/API<\/p>\n<p>&mdash; boB Rudis (@hrbrmstr) <a href=\"https:\/\/mobile.twitter.com\/hrbrmstr\/status\/922107653681242112?ref_src=twsrc%5Etfw\">October 22, 2017<\/a><\/p><\/blockquote>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>Make sure to try out the <a href=\"https:\/\/github.com\/mkearney\/rtweet\/\">GitHub version<\/a> as well since it has gained some new functionality not currently in CRAN and don&#8217;t hesitate to ping @kearneymw on Twitter (though he may regret me suggesting that :-).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Way back in July of 2009, the first version of the twitteR package was published by Geoff Jentry in CRAN. Since then it has seen 28 updates, finally breaking the 0.x.y barrier into 1.x.y territory in March of 2013 and receiving it&#8217;s last update in July of 2015. For a very long time, the twitteR [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91,655],"tags":[810],"class_list":["post-6788","post","type-post","status-publish","format-standard","hentry","category-r","category-twitter-2","tag-post"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>A Call to Tweets (&amp; Blog Posts)! - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Call to Tweets (&amp; Blog Posts)! - rud.is\" \/>\n<meta property=\"og:description\" content=\"Way back in July of 2009, the first version of the twitteR package was published by Geoff Jentry in CRAN. Since then it has seen 28 updates, finally breaking the 0.x.y barrier into 1.x.y territory in March of 2013 and receiving it&#8217;s last update in July of 2015. For a very long time, the twitteR [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2017-10-22T18:11:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-10T12:54:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"A Call to Tweets (&#038; Blog Posts)!\",\"datePublished\":\"2017-10-22T18:11:09+00:00\",\"dateModified\":\"2018-03-10T12:54:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/\"},\"wordCount\":665,\"commentCount\":9,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cranlogs.r-pkg.org:443\\\/badges\\\/grand-total\\\/twitteR\",\"keywords\":[\"post\"],\"articleSection\":[\"R\",\"twitter\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/\",\"name\":\"A Call to Tweets (& Blog Posts)! - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cranlogs.r-pkg.org:443\\\/badges\\\/grand-total\\\/twitteR\",\"datePublished\":\"2017-10-22T18:11:09+00:00\",\"dateModified\":\"2018-03-10T12:54:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cranlogs.r-pkg.org:443\\\/badges\\\/grand-total\\\/twitteR\",\"contentUrl\":\"https:\\\/\\\/cranlogs.r-pkg.org:443\\\/badges\\\/grand-total\\\/twitteR\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/10\\\/22\\\/a-call-to-tweets-blog-posts\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Call to Tweets (&#038; Blog Posts)!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A Call to Tweets (& Blog Posts)! - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/","og_locale":"en_US","og_type":"article","og_title":"A Call to Tweets (& Blog Posts)! - rud.is","og_description":"Way back in July of 2009, the first version of the twitteR package was published by Geoff Jentry in CRAN. Since then it has seen 28 updates, finally breaking the 0.x.y barrier into 1.x.y territory in March of 2013 and receiving it&#8217;s last update in July of 2015. For a very long time, the twitteR [&hellip;]","og_url":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/","og_site_name":"rud.is","article_published_time":"2017-10-22T18:11:09+00:00","article_modified_time":"2018-03-10T12:54:16+00:00","og_image":[{"url":"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR","type":"","width":"","height":""}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"A Call to Tweets (&#038; Blog Posts)!","datePublished":"2017-10-22T18:11:09+00:00","dateModified":"2018-03-10T12:54:16+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/"},"wordCount":665,"commentCount":9,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#primaryimage"},"thumbnailUrl":"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR","keywords":["post"],"articleSection":["R","twitter"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/","url":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/","name":"A Call to Tweets (& Blog Posts)! - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#primaryimage"},"thumbnailUrl":"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR","datePublished":"2017-10-22T18:11:09+00:00","dateModified":"2018-03-10T12:54:16+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#primaryimage","url":"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR","contentUrl":"https:\/\/cranlogs.r-pkg.org:443\/badges\/grand-total\/twitteR"},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2017\/10\/22\/a-call-to-tweets-blog-posts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"A Call to Tweets (&#038; Blog Posts)!"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-1Lu","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":10243,"url":"https:\/\/rud.is\/b\/2018\/05\/03\/seventeen-minutes-from-tweet-to-package\/","url_meta":{"origin":6788,"position":0},"title":"Seventeen Minutes From Tweet To Package","author":"hrbrmstr","date":"2018-05-03","format":false,"excerpt":"Earlier today, @noamross posted to Twitter: #rstats #lazyweb What's the R\/httr\/curl equivalent of curl -F \"file=@somefile.html\" https:\/\/t.co\/abbugLz9ZW\u2014 Noam Ross (@noamross) May 3, 2018 The answer was a 1:1 \"file upload\" curl to httr translation: but I wanted to do more than that since Noam took 20 minutes out his day\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4515,"url":"https:\/\/rud.is\/b\/2016\/07\/10\/cran-packages-on-github-and-some-cran-description-observations\/","url_meta":{"origin":6788,"position":1},"title":"CRAN Packages on GitHub (and some CRAN DESCRIPTION observations)","author":"hrbrmstr","date":"2016-07-10","format":false,"excerpt":"Just about a week ago @thosjleeper posited something on twitter w\/r\/t how many CRAN packages had associations with GitHub (i.e. how many used GitHub for development). The `DESCRIPTION` file (that comes with all R packages) has some fields that can house this information and most folks who do use GitHub\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4852,"url":"https:\/\/rud.is\/b\/2017\/01\/08\/2017-01-authored-package-updates\/","url_meta":{"origin":6788,"position":2},"title":"2017-01 Authored Package Updates","author":"hrbrmstr","date":"2017-01-08","format":false,"excerpt":"The rest of the month is going to be super-hectic and it's unlikely I'll be able to do any more to help the push to CRAN 10K, so here's a breakdown of CRAN and GitHub new packages & package updates that I felt were worth raising awareness on: epidata I\u2026","rel":"","context":"In &quot;dplyr&quot;","block_context":{"text":"dplyr","link":"https:\/\/rud.is\/b\/category\/dplyr\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/01\/epi2.png?fit=982%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/01\/epi2.png?fit=982%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/01\/epi2.png?fit=982%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/01\/epi2.png?fit=982%2C1200&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":3460,"url":"https:\/\/rud.is\/b\/2015\/06\/15\/metricsgraphics-0-8-5-is-now-on-cran\/","url_meta":{"origin":6788,"position":3},"title":"metricsgraphics 0.8.5 is now on CRAN!","author":"hrbrmstr","date":"2015-06-15","format":false,"excerpt":"I'm super-pleased to announce that the Benevolent CRAN Overlords [accepted the metricsgraphics package](http:\/\/cran.r-project.org\/web\/packages\/metricsgraphics\/index.html) into CRAN over the weekend. Now, you no longer need to rely on github\/devtools to use [MetricsGraphics.js](http:\/\/metricsgraphicsjs.org\/) charts from your R scripts. If you're not familiar with `htmlwidgets`, take a look at [the official site for them](http:\/\/www.htmlwidgets.org\/).\u2026","rel":"","context":"In &quot;d3&quot;","block_context":{"text":"d3","link":"https:\/\/rud.is\/b\/category\/d3\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4547,"url":"https:\/\/rud.is\/b\/2016\/07\/24\/mid-year-r-packages-update-summary\/","url_meta":{"origin":6788,"position":4},"title":"Mid-year R Packages Update Summary","author":"hrbrmstr","date":"2016-07-24","format":false,"excerpt":"I been updating some existing packages and github-releasing new ones (before a CRAN push). Most are \"cyber\"-related, but there are some general purpose ones. Here's a quick overview: docxtractr (CRAN, now, v0.2.0) was initially designed to make it easy to get data tables out of MS Word (docx) documents. The\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3610,"url":"https:\/\/rud.is\/b\/2015\/08\/09\/cdcfluview-on-the-way-to-cran-7k\/","url_meta":{"origin":6788,"position":5},"title":"cdcfluview &#8211; On The Way to &#8220;CRAN 7K&#8221;","author":"hrbrmstr","date":"2015-08-09","format":false,"excerpt":"I like to turn coincidence into convergence whenever possible. This weekend, a user of [cdcfluview](http:\/\/github.com\/hrbrmstr\/cdcfluview) had a question that caused me to notice a difference in behaviour between the package was interacting with CDC FluView API, so I updated the package to accommodate the change and the user. Around the\u2026","rel":"","context":"In &quot;Data Analysis&quot;","block_context":{"text":"Data Analysis","link":"https:\/\/rud.is\/b\/category\/data-analysis-2\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/6788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=6788"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/6788\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=6788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=6788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=6788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}