R Posts You Might Have Missed!

[This article was first published on Alastair Rushworth, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

TL;DR

I wanted something that goes some way to automating my own
time-consuming process of scrolling twitter for cool things to read. I
thought a few other people might feel somewhat similar, so I decided to
build a feed.

R posts you might have missed is an
semi-automated twitter account posting recent R-related content. The
goal is to make it easier to keep up with the most important packages
and news from the community. Links to relevant and popular resources are
gathered from twitter and the R blogosphere before being processed and
lightly curated.

Read on to learn the origin story of the account, how it works and what
comes next!

News overload!

Keeping track of new developments in the data science, open source and R
communities is hard. The number of active developers, application areas
and R packages is exploding. Ever since I started writing R code I’ve
found it hard to avoid reinventing solutions to problems that are
already solved by other developers, usually through ignorance of those
developments. Being up-to-date with recent developments equips you with
options that can change the way you approach a new problem.

This is more or less the reason I still use twitter, because it’s still
the place where a majority of R developers hang out and share their
projects and ideas. The problem is that the volume of new stuff is just
too large – and I could easily spend endless hours per week scrolling
twitter, discovering and re-discovering new stuff (and getting very
distracted in the process). This is compounded by twitter’s news feed
algorithm which I think has made it even harder to develop a tailored
feed. So what can you do?

Well you’ve got options of course. R
Bloggers
has been around for some time and
aggregates the feeds of several hundred well-known R blogs. I’ve never
found this solves my problem: blog articles are one type of content, but
there are many other types of content that I’d like to see in the same
place, and most of them do not have RSS feeds. The site itself carries a
lot of banner ads and doesn’t render articles very nicely – although
those may be minor considerations if you still use an RSS reader to
access the posts.

Ok so what else? R-Weekly is a terrific
resource. The team gather links to posts, packages, community news and
tweets into a single weekly digest. I think R Weekly is a wonderful
resource, and I still read it every week – it does a particularly good
job of creating a nicely formatted list broken into content types and
topics that were active in the last week. However, this doesn’t scratch
my itch completely. One issue is that it’s not totally automated (AFAIK,
please correct me if that’s false), and there’s always the risk that
something gets excluded. Additionally – any news oriented resource
focusses on what’s occurred most recently (of course, yeah I know) and
by definition excludes older useful resources that keep resurfacing. I
think it’s good for those things to continue to get air-time –
particularly because if I’m not working on a specific topic at the time
of the initial news announcement, I’ll probably forget about it. Or more
likely I just missed the announcement to begin with. I think repeated
exposure and reminders can be important.

Long story short, I wanted something that goes some way to automating my
own time-consuming process of scrolling twitter for cool things to read.
I thought a few other people might feel somewhat similar, so I decided
to build a feed.

R posts you might have missed

R posts you might have missed is a twitter feed with the following
attributes:

  • Publishes about 10 posts per day
  • Posts are usually blog posts, repos and tutorials containing R code
  • Emphasis on non-commercial content that is free to access
  • Lightly curated with a lean towards more recent posts and repos
  • Ensure the author is directly credited in each post

How does it work?

The recipe underpinning the feed takes the following steps:

1. Gather links from #rstats twitter

  • Use Michael Kearney’s rtweet
    package to gather recent #rstats tagged tweets from twitter (last 9
    days)
  • Also use rtweet to gather
    tweets from a subset of highly active users – not all of these are
    necessarily #rstats tagged
  • Extract the urls embedded inside the tweets

2. Gather new post urls from RSS feeds

  • Use Robert Myles McDonnell’s
    tidyRSS package to read
    a large number of RSS
    feeds
    .
  • Extract the urls of posts published in the last week that include
    code chunks

3. Read and filter urls based on content

  • Steps 1. and 2. usually result in around 2000 urls per week. Use
    htmldf to download
    page content from the urls.
  • Filter out any pages that don’t have code tags in the source and
    that haven’t already been tweeted by R posts you might have missed
    recently.
  • Filter out any commercial content, anything that looks spammy. This
    uses some simple lists of sites to exclude. Medium posts are also
    completely filtered out – Medium paywalls it’s content, and also
    tends to have lower quality content in general.
  • Extract page titles from , </code> or <code><br /> <h1></code> tags. For<br /> github repos, extract repo descriptions. These are used for<br /> composing tweets.</li> <li>After reading and filtering, we’re usually down to about 300<br /> possible resources and urls we could tweet.</li> <li>For each of the 300 pages, extract image urls on each page (images<br /> are selected manually in the next step). Download and convert any<br /> images that are base64 or SVG encoded to png (twitter doesn’t accept<br /> these file types in tweets).</li> </ul> <p><strong>4. Find the author’s twitter username</strong></p> <ul> <li>Usually, bloggers declare their social media profile information on<br /> their blogs. If this is the case, <code>htmldf</code> does a reasonable job of<br /> finding these automatically in the html.</li> <li>Author credentials are a bit trickier for github repos. Sometimes,<br /> this is directly embedded on the user’s GH profile – so all we need<br /> to do is visit the profile associated with the repo, and fetch the<br /> credentials from there. Sometimes twitter credentials aren’t<br /> provided here, but a personal website is declared on the GH profile<br /> where twitter profiles can be found. 80% of the time it seems that<br /> about 80% of R users twitter details can be gathered this way from<br /> their GH profile.</li> </ul> <figure> <p><img src="https://i1.wp.com/alastairrushworth.github.io/assets/images/gh_profile.png?w=450&ssl=1" class="center jetpack-lazy-image" data-recalc-dims="1" data-lazy-src="https://i1.wp.com/alastairrushworth.github.io/assets/images/gh_profile.png?w=450&is-pending-load=1#038;ssl=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"><noscript><img src="https://i1.wp.com/alastairrushworth.github.io/assets/images/gh_profile.png?w=450&ssl=1" class="center" data-recalc-dims="1" /></noscript><figcaption> <p>Hello?\! Is it me you’re looking for?</p> </figcaption></figure> <p><strong>5. Compose tweets using an interactive shiny app</strong></p> <p>Everything until this point is totally automatic and carried out using a<br /> batch process on a cheap Google VM. Now the tweets are composed from<br /> various ingredients that have been gathered. To do this, a simple GUI<br /> built using R shiny, provides a simple editing environment to choose the<br /> correct author credentials, choose an image to show with the post and to<br /> check for any errors or formatting issues. For each tweet:</p> <ul> <li>Check the authorship from a list of options gathered in the previous<br /> scraping steps.</li> <li>Check the title, check emoji and choose a display image.</li> <li>Filter out tweets that aren’t relevant.</li> <li>Save the tweets to <code>.csv</code>: this includes columns for scheduled time<br /> (a randomly generated time in the week following <code>Sys.time()</code>),<br /> tweet text and image url.</li> </ul> <figure> <p><img src="https://i2.wp.com/alastairrushworth.github.io/assets/images/app_gif.gif?w=450&ssl=1" class="center jetpack-lazy-image" data-recalc-dims="1" data-lazy-src="https://i2.wp.com/alastairrushworth.github.io/assets/images/app_gif.gif?w=450&is-pending-load=1#038;ssl=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"><noscript><img src="https://i2.wp.com/alastairrushworth.github.io/assets/images/app_gif.gif?w=450&ssl=1" class="center" data-recalc-dims="1" /></noscript><figcaption> <p>A hideously basic shiny app for choosing images and author names. It’s<br /> simple but does the job\!</p> </figcaption></figure> <p><strong>6. Post!</strong></p> <ul> <li>Bulk upload the processed tweets to a scheduling service – I use<br /> <a href="https://alastairrushworth.github.io/R-Posts-You-Might-Have-Missed!/oneupapp.io" rel="nofollow" target="_blank">OneUpApp</a> who are particularly flexible with bulk<br /> uploads and cross-posting to other social networks.</li> </ul> <figure> <p><img src="https://i1.wp.com/alastairrushworth.github.io/assets/images/oneupapp.png?w=450&ssl=1" class="center jetpack-lazy-image" data-recalc-dims="1" data-lazy-src="https://i1.wp.com/alastairrushworth.github.io/assets/images/oneupapp.png?w=450&is-pending-load=1#038;ssl=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"><noscript><img src="https://i1.wp.com/alastairrushworth.github.io/assets/images/oneupapp.png?w=450&ssl=1" class="center" data-recalc-dims="1" /></noscript><figcaption> <p>This is a tweet scheduling service. There are many like it, but this one<br /> is mine.</p> </figcaption></figure> <h3 id="what-next">What next?</h3> <p>There’s a lot to do. In the short-term the intention is to</p> <ul> <li>Reduce the effort involved in manual curation. The curation process<br /> takes about an hour for a week’s worth of R tweets, most of that<br /> time is checking author credentials are correct and that the urls<br /> contain high-quality content. A bit more NLP could help with both of<br /> these tasks.</li> <li>Improve cross-posted author tagging for LinkedIn and Facebook posts.<br /> At present, full user credentials only appear on the twitter posts.<br /> It doesn’t seem to be possible/easy to schedule posts to LinkedIn<br /> with profile tags, where the author’s LinkedIn profile is known.</li> <li>Incorporate R-adjacent content. All of the candidate posts either<br /> contain code tags in the html, or are github repositories. Posts<br /> that are <em>about</em> R and data science but don’t include any code (like<br /> this one) are automatically excluded. It would be a big step to<br /> automatically identify and include these pages too.</li> </ul> <h3 id="are-you-a-data-scientist-with-an-interest-in-python">Are you a data scientist with an interest in Python?</h3> <p><a href="https://twitter.com/icymi_py" rel="nofollow" target="_blank">We’ve got you covered!</a></p> <h3 id="comments-suggestions-issues">Comments? Suggestions? Issues?</h3> <p>Feedback is very welcome! Do you find <em>R posts you might have missed</em><br /> useful? What do you like? How would you improve it? Find me on twitter<br /> at <a href="https://twitter.com/rushworth_a" rel="nofollow" target="_blank">rushworth_a</a> or <a href="https://github.com/alastairrushworth/rpy_posts/issues" rel="nofollow" target="_blank">write a github<br /> issue here</a>.</p> <script type="text/javascript"> var vglnk = {key: '949efb41171ac6ec1bf7f206d57e90b8'}; (function(d, t) { var s = d.createElement(t); s.type = 'text/javascript'; s.async = true; // s.defer = true; // s.src = '//cdn.viglink.com/api/vglnk.js'; s.src = 'https://www.r-bloggers.com/wp-content/uploads/2020/08/vglnk.js'; var r = d.getElementsByTagName(t)[0]; r.parentNode.insertBefore(s, r); }(document, 'script')); </script> <div id='jp-relatedposts' class='jp-relatedposts' > <h3 class="jp-relatedposts-headline"><em>Related</em></h3> </div><aside class="mashsb-container mashsb-main mashsb-stretched"><div class="mashsb-box"><div class="mashsb-buttons"><a class="mashicon-facebook mash-small mash-center mashsb-noshadow" href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.r-bloggers.com%2F2020%2F07%2Fr-posts-you-might-have-missed%2F" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">Share</span></a><a class="mashicon-twitter mash-small mash-center mashsb-noshadow" href="https://twitter.com/intent/tweet?text=R%20Posts%20You%20Might%20Have%20Missed%21&url=https://www.r-bloggers.com/2020/07/r-posts-you-might-have-missed/&via=Rbloggers" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">Tweet</span></a><div class="onoffswitch2 mash-small mashsb-noshadow" style="display:none;"></div></div> </div> <div style="clear:both;"></div></aside> <!-- Share buttons by mashshare.net - Version: 3.7.7--> <p class="syndicated-attribution"><div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;"> <div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://alastairrushworth.github.io/R-Posts-You-Might-Have-Missed!/"> Alastair Rushworth</a></strong>.</div> <hr /> <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>. <hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't. </div></p> </div> </article><nav class="post-navigation clearfix" role="navigation"> <div class="post-nav left"> <a href="https://www.r-bloggers.com/2020/07/r-code-for-removing-bias-in-covid-19-data-using-econometric-tools/" rel="prev">← Previous post</a></div> <div class="post-nav right"> <a href="https://www.r-bloggers.com/2020/07/introduction-to-mebootspear-function/" rel="next">Next post →</a></div> </nav> </div> <aside class="mh-sidebar sb-right"> <div id="custom_html-2" class="widget_text sb-widget widget_custom_html"><div class="textwidget custom-html-widget"> <div class="top-search" style="padding-left: 0px;"> <form id="searchform" action="http://www.google.com/cse" target="_blank"> <div> <input type="hidden" name="cx" value="005359090438081006639:paz69t-s8ua" /> <input type="hidden" name="ie" value="UTF-8" /> <input type="text" value="" name="q" id="q" autocomplete="on" style="font-size:16px;" placeholder="Search R-bloggers.." /> <input type="submit" id="searchsubmit2" name="sa" value="Go" style="font-size:16px;" /> </div> </form> </div> <!-- thanks: https://stackoverflow.com/questions/14981575/google-cse-with-a-custom-form https://stackoverflow.com/questions/10363674/change-size-of-text-in-text-input-tag --></div></div><div id="text-6" class="sb-widget widget_text"> <div class="textwidget"><div style="min-height:26px;border:1px solid #ccc;padding:3px;text-align:left; background: none repeat scroll 0 0 #FDEADA;"> <form style="width:202px; float:left;" action="https://feedburner.google.com/fb/a/mailverify" method="post" target="popupwindow" onsubmit="window.open('https://feedburner.google.com/fb/a/mailverify?uri=RBloggers', 'popupwindow', 'scrollbars=yes,width=550,height=520');return true"> <input type="text" style="width:110px" onclick="if (this.value == 'Your e-mail here') this.value = '';" value='Your e-mail here' name="email"/> <input type="hidden" value="RBloggers" name="uri"/><input type="hidden" name="loc" value="en_US"/><input type="submit" value="Subscribe" /> <!-- https://feeds.feedburner.com/~fc/RBloggers?bg=99CCFF&fg=444444&anim=0 --> </form> <div> <a href="https://feeds.feedburner.com/RBloggers"><img src="https://i2.wp.com/www.r-bloggers.com/wp-content/uploads/2020/07/RBloggers_feedburner_count_2020_07_01-e1593671704447.gif?w=578&ssl=1" style="height:17px;min-width:80px;class:skip-lazy;" alt data-recalc-dims="1" data-lazy-src="https://i2.wp.com/www.r-bloggers.com/wp-content/uploads/2020/07/RBloggers_feedburner_count_2020_07_01-e1593671704447.gif?w=578&is-pending-load=1#038;ssl=1" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class=" jetpack-lazy-image"><noscript><img src="https://i2.wp.com/www.r-bloggers.com/wp-content/uploads/2020/07/RBloggers_feedburner_count_2020_07_01-e1593671704447.gif?w=578&ssl=1" style="height:17px;min-width:80px;class:skip-lazy;" alt="" data-recalc-dims="1" /></noscript></a> </div> </div> <br/> <div> <script> function init() { var vidDefer = document.getElementsByTagName('iframe'); for (var i=0; i<vidDefer.length; i++) { if(vidDefer[i].getAttribute('data-src')) { vidDefer[i].setAttribute('src',vidDefer[i].getAttribute('data-src')); } } } window.onload = init; </script> <iframe allowtransparency="true" frameborder="0" scrolling="no" src="" data-src="//platform.twitter.com/widgets/follow_button.html?screen_name=rbloggers&data-show-count" style="width:100%; height:30px;"></iframe> <div id="fb-root"></div> <script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v7.0&appId=124112670941750&autoLogAppEvents=1" nonce="RysU23SE"></script> <div style="min-height: 154px;" class="fb-page" data-href="https://www.facebook.com/rbloggers/" data-tabs="" data-width="300" data-height="154" data-small-header="true" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"><blockquote cite="https://www.facebook.com/rbloggers/" class="fb-xfbml-parse-ignore"><a href="https://www.facebook.com/rbloggers/">R bloggers Facebook page</a></blockquote></div> <!-- <iframe src="" data-src="//www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fpages%2FR-bloggers%2F191414254890&width=300&height=155&show_faces=true&colorscheme=light&stream=false&border_color&header=false&appId=400430016676958" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100%; height:140px;" allowTransparency="true"></iframe> --> <!-- <br/> <strong>If you are an R blogger yourself</strong> you are invited to <a href="https://www.r-bloggers.com/add-your-blog/">add your own R content feed to this site</a> (<strong>Non-English</strong> R bloggers should add themselves- <a href="https://www.r-bloggers.com/lang/add-your-blog">here</a>) --> </div></div> </div><div id="wppp-3" class="sb-widget widget_wppp"><h4 class="widget-title">Most viewed posts (weekly)</h4> <ul class='wppp_list'> <li><a href='https://www.r-bloggers.com/2016/11/5-ways-to-subset-a-data-frame-in-r/' title='5 Ways to Subset a Data Frame in R'>5 Ways to Subset a Data Frame in R</a></li> <li><a href='https://www.r-bloggers.com/2015/12/how-to-write-the-first-for-loop-in-r/' title='How to write the first for loop in R'>How to write the first for loop in R</a></li> <li><a href='https://www.r-bloggers.com/2013/08/date-formats-in-r/' title='Date Formats in R'>Date Formats in R</a></li> <li><a href='https://www.r-bloggers.com/2010/02/r-sorting-a-data-frame-by-the-contents-of-a-column/' title='R – Sorting a data frame by the contents of a column'>R – Sorting a data frame by the contents of a column</a></li> <li><a href='https://www.r-bloggers.com/2020/09/the-fastest-way-to-read-and-writes-file-in-r/' title='The fastest way to Read and Writes file in R'>The fastest way to Read and Writes file in R</a></li> <li><a href='https://www.r-bloggers.com/2020/09/generalized-linear-models-and-plots-with-edger-advanced-differential-expression-analysis/' title='Generalized Linear Models and Plots with edgeR – Advanced Differential Expression Analysis'>Generalized Linear Models and Plots with edgeR – Advanced Differential Expression Analysis</a></li> <li><a href='https://www.r-bloggers.com/2020/01/how-to-remove-outliers-in-r/' title='How to Remove Outliers in R'>How to Remove Outliers in R</a></li> </ul> </div><div id="text-18" class="sb-widget widget_text"><h4 class="widget-title">Sponsors</h4> <div class="textwidget"><div style="min-height: 2055px;"> <script data-cfasync="false" type="text/javascript"> // https://support.cloudflare.com/hc/en-us/articles/200169436-How-can-I-have-Rocket-Loader-ignore-my-script-s-in-Automatic-Mode- // this must be placed higher. Otherwise it doesn't work. // data-cfasync="false" is for making sure cloudflares' rocketcache doesn't interfeare with this // in this case it only works because it was used at the original script in the text widget function createCookie(name,value,days) { var expires = ""; if (days) { var date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + value + expires + "; path=/"; } function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } function eraseCookie(name) { createCookie(name,"",-1); } // no longer use async because of google // async async function readTextFile(file) { // Helps people browse between pages without the need to keep downloading the same // ads txt page everytime. This way, it allows them to use their browser's cache. var random_number = readCookie("ad_random_number_cookie"); if(random_number == null) { var random_number = Math.floor(Math.random()*100*(new Date().getTime()/10000000000)); createCookie("ad_random_number_cookie",random_number,1) } file += '?t='+random_number; var rawFile = new XMLHttpRequest(); rawFile.onreadystatechange = function () { if(rawFile.readyState === 4) { if(rawFile.status === 200 || rawFile.status == 0) { // var allText = rawFile.responseText; // document.write(allText); document.write(rawFile.responseText); } } } rawFile.open("GET", file, false); rawFile.send(null); } // readTextFile('https://raw.githubusercontent.com/Raynos/file-store/master/temp.txt'); readTextFile("https://www.r-bloggers.com/wp-content/uploads/text-widget_anti-cache.txt"); </script> </div></div> </div> <div id="recent-posts-3" class="sb-widget widget_recent_entries"> <h4 class="widget-title">Recent Posts</h4> <ul> <li> <a href="https://www.r-bloggers.com/2020/09/building-a-simple-pipeline-in-r/">Building a Simple Pipeline in R</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/building-apps-with-shinipsum-and-golem/">Building apps with {shinipsum} and {golem}</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/slicing-the-onion-3-ways-toy-problems-in-r-python-and-julia/">Slicing the onion 3 ways- Toy problems in R, python, and Julia</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/path-chain-concise-structure-for-chainable-paths/">path.chain: Concise Structure for Chainable Paths</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/generalized-linear-models-and-plots-with-edger-advanced-differential-expression-analysis/">Generalized Linear Models and Plots with edgeR – Advanced Differential Expression Analysis</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/national-weekly-death-rates/">National Weekly Death Rates</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/kmeans-clustering-of-penguins-2/">Kmeans Clustering of Penguins</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/running-an-r-script-on-a-schedule-overview/">Running an R Script on a Schedule: Overview</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/free-workshop-on-deep-learning-with-keras-and-tensorflow/">Free workshop on Deep Learning with Keras and TensorFlow</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/le-monde-puzzle-1155/">Le Monde puzzle [#1155]</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/the-fastest-way-to-read-and-writes-file-in-r/">The fastest way to Read and Writes file in R</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/why-r-2020-conference-starts-2020-09-26/">Why R? 2020 Conference Starts 2020-09-26</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/free-text-in-surveys-important-issues-in-the-2017-new-zealand-election-study-by-ellis2013nz/">Free text in surveys – important issues in the 2017 New Zealand Election Study by @ellis2013nz</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/lessons-learned-from-500-data-science-interviews/">Lessons learned from 500+ Data Science interviews</a> </li> <li> <a href="https://www.r-bloggers.com/2020/09/writing-conundrums/">Writing conundrums</a> </li> </ul> </div><div id="rss-7" class="sb-widget widget_rss"><h4 class="widget-title"><a class="rsswidget" href="https://feeds.feedburner.com/Rjobs"><img class="rss-widget-icon" style="border:0" width="14" height="14" src="https://www.r-bloggers.com/wp-includes/images/rss.png" alt="RSS" /></a> <a class="rsswidget" href="https://www.r-users.com/">Jobs for R-users</a></h4><ul><li><a class='rsswidget' href='http://feedproxy.google.com/~r/RJobs/~3/XUqQfUzxziw/'>Junior Data Scientist / Quantitative economist</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/RJobs/~3/C2KYkXtMCHw/'>Senior Quantitative Analyst</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/RJobs/~3/z5mEr8qKkUI/'>R programmer</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/RJobs/~3/wi3Gfi8GNqA/'>Data Scientist – CGIAR Excellence in Agronomy (Ref No: DDG-R4D/DS/1/CG/EA/06/20)</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/RJobs/~3/aSK4JGQQOfg/'>Data Analytics Auditor, Future of Audit Lead @ London or Newcastle</a></li></ul></div><div id="rss-9" class="sb-widget widget_rss"><h4 class="widget-title"><a class="rsswidget" href="https://feeds.feedburner.com/Python-bloggers"><img class="rss-widget-icon" style="border:0" width="14" height="14" src="https://www.r-bloggers.com/wp-includes/images/rss.png" alt="RSS" /></a> <a class="rsswidget" href="https://python-bloggers.com/">python-bloggers.com (python/data-science news)</a></h4><ul><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/aeOWm291YBM/'>Writing conundrums</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/Eu8ZoDGo_ro/'>Introducing Unguided Projects: The World’s First Interactive Code-Along Exercises</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/nEBrVWBG7Ao/'>Document Letter Frequency in Python</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/oQGmvR_1iGg/'>Equipping Petroleum Engineers in Calgary With Critical Data Skills</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/UcltGO0ZtYA/'>Connecting Python to SQL Server using trusted and login credentials</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/zRTGnHNTQR8/'>Intro to GSC API with Python (Video)</a></li><li><a class='rsswidget' href='http://feedproxy.google.com/~r/Python-bloggers/~3/Ih7X5g4SNhM/'>Technical documentation</a></li></ul></div><div id="text-16" class="sb-widget widget_text"> <div class="textwidget"><strong><a href="https://www.r-bloggers.com/blogs-list/">Full list of contributing R-bloggers</a></strong></div> </div><div id="archives-3" class="sb-widget widget_archive"><h4 class="widget-title">Archives</h4> <label class="screen-reader-text" for="archives-dropdown-3">Archives</label> <select id="archives-dropdown-3" name="archive-dropdown"> <option value="">Select Month</option> <option value='https://www.r-bloggers.com/2020/09/'> September 2020  (162)</option> <option value='https://www.r-bloggers.com/2020/08/'> August 2020  (180)</option> <option value='https://www.r-bloggers.com/2020/07/'> July 2020  (229)</option> <option value='https://www.r-bloggers.com/2020/06/'> June 2020  (204)</option> <option value='https://www.r-bloggers.com/2020/05/'> May 2020  (285)</option> <option value='https://www.r-bloggers.com/2020/04/'> April 2020  (292)</option> <option value='https://www.r-bloggers.com/2020/03/'> March 2020  (246)</option> <option value='https://www.r-bloggers.com/2020/02/'> February 2020  (219)</option> <option value='https://www.r-bloggers.com/2020/01/'> January 2020  (213)</option> <option value='https://www.r-bloggers.com/2019/12/'> December 2019  (215)</option> <option value='https://www.r-bloggers.com/2019/11/'> November 2019  (193)</option> <option value='https://www.r-bloggers.com/2019/10/'> October 2019  (216)</option> <option value='https://www.r-bloggers.com/2019/09/'> September 2019  (211)</option> <option value='https://www.r-bloggers.com/2019/08/'> August 2019  (256)</option> <option value='https://www.r-bloggers.com/2019/07/'> July 2019  (228)</option> <option value='https://www.r-bloggers.com/2019/06/'> June 2019  (218)</option> <option value='https://www.r-bloggers.com/2019/05/'> May 2019  (250)</option> <option value='https://www.r-bloggers.com/2019/04/'> April 2019  (275)</option> <option value='https://www.r-bloggers.com/2019/03/'> March 2019  (295)</option> <option value='https://www.r-bloggers.com/2019/02/'> February 2019  (255)</option> <option value='https://www.r-bloggers.com/2019/01/'> January 2019  (281)</option> <option value='https://www.r-bloggers.com/2018/12/'> December 2018  (252)</option> <option value='https://www.r-bloggers.com/2018/11/'> November 2018  (285)</option> <option value='https://www.r-bloggers.com/2018/10/'> October 2018  (308)</option> <option value='https://www.r-bloggers.com/2018/09/'> September 2018  (291)</option> <option value='https://www.r-bloggers.com/2018/08/'> August 2018  (270)</option> <option value='https://www.r-bloggers.com/2018/07/'> July 2018  (333)</option> <option value='https://www.r-bloggers.com/2018/06/'> June 2018  (298)</option> <option value='https://www.r-bloggers.com/2018/05/'> May 2018  (321)</option> <option value='https://www.r-bloggers.com/2018/04/'> April 2018  (301)</option> <option value='https://www.r-bloggers.com/2018/03/'> March 2018  (291)</option> <option value='https://www.r-bloggers.com/2018/02/'> February 2018  (241)</option> <option value='https://www.r-bloggers.com/2018/01/'> January 2018  (330)</option> <option value='https://www.r-bloggers.com/2017/12/'> December 2017  (261)</option> <option value='https://www.r-bloggers.com/2017/11/'> November 2017  (270)</option> <option value='https://www.r-bloggers.com/2017/10/'> October 2017  (290)</option> <option value='https://www.r-bloggers.com/2017/09/'> September 2017  (294)</option> <option value='https://www.r-bloggers.com/2017/08/'> August 2017  (340)</option> <option value='https://www.r-bloggers.com/2017/07/'> July 2017  (283)</option> <option value='https://www.r-bloggers.com/2017/06/'> June 2017  (317)</option> <option value='https://www.r-bloggers.com/2017/05/'> May 2017  (349)</option> <option value='https://www.r-bloggers.com/2017/04/'> April 2017  (324)</option> <option value='https://www.r-bloggers.com/2017/03/'> March 2017  (365)</option> <option value='https://www.r-bloggers.com/2017/02/'> February 2017  (317)</option> <option value='https://www.r-bloggers.com/2017/01/'> January 2017  (367)</option> <option value='https://www.r-bloggers.com/2016/12/'> December 2016  (347)</option> <option value='https://www.r-bloggers.com/2016/11/'> November 2016  (294)</option> <option value='https://www.r-bloggers.com/2016/10/'> October 2016  (306)</option> <option value='https://www.r-bloggers.com/2016/09/'> September 2016  (254)</option> <option value='https://www.r-bloggers.com/2016/08/'> August 2016  (287)</option> <option value='https://www.r-bloggers.com/2016/07/'> July 2016  (326)</option> <option value='https://www.r-bloggers.com/2016/06/'> June 2016  (263)</option> <option value='https://www.r-bloggers.com/2016/05/'> May 2016  (292)</option> <option value='https://www.r-bloggers.com/2016/04/'> April 2016  (260)</option> <option value='https://www.r-bloggers.com/2016/03/'> March 2016  (302)</option> <option value='https://www.r-bloggers.com/2016/02/'> February 2016  (268)</option> <option value='https://www.r-bloggers.com/2016/01/'> January 2016  (337)</option> <option value='https://www.r-bloggers.com/2015/12/'> December 2015  (304)</option> <option value='https://www.r-bloggers.com/2015/11/'> November 2015  (234)</option> <option value='https://www.r-bloggers.com/2015/10/'> October 2015  (259)</option> <option value='https://www.r-bloggers.com/2015/09/'> September 2015  (238)</option> <option value='https://www.r-bloggers.com/2015/08/'> August 2015  (264)</option> <option value='https://www.r-bloggers.com/2015/07/'> July 2015  (243)</option> <option value='https://www.r-bloggers.com/2015/06/'> June 2015  (213)</option> <option value='https://www.r-bloggers.com/2015/05/'> May 2015  (235)</option> <option value='https://www.r-bloggers.com/2015/04/'> April 2015  (211)</option> <option value='https://www.r-bloggers.com/2015/03/'> March 2015  (259)</option> <option value='https://www.r-bloggers.com/2015/02/'> February 2015  (212)</option> <option value='https://www.r-bloggers.com/2015/01/'> January 2015  (245)</option> <option value='https://www.r-bloggers.com/2014/12/'> December 2014  (236)</option> <option value='https://www.r-bloggers.com/2014/11/'> November 2014  (221)</option> <option value='https://www.r-bloggers.com/2014/10/'> October 2014  (218)</option> <option value='https://www.r-bloggers.com/2014/09/'> September 2014  (259)</option> <option value='https://www.r-bloggers.com/2014/08/'> August 2014  (217)</option> <option value='https://www.r-bloggers.com/2014/07/'> July 2014  (235)</option> <option value='https://www.r-bloggers.com/2014/06/'> June 2014  (241)</option> <option value='https://www.r-bloggers.com/2014/05/'> May 2014  (243)</option> <option value='https://www.r-bloggers.com/2014/04/'> April 2014  (260)</option> <option value='https://www.r-bloggers.com/2014/03/'> March 2014  (289)</option> <option value='https://www.r-bloggers.com/2014/02/'> February 2014  (269)</option> <option value='https://www.r-bloggers.com/2014/01/'> January 2014  (263)</option> <option value='https://www.r-bloggers.com/2013/12/'> December 2013  (264)</option> <option value='https://www.r-bloggers.com/2013/11/'> November 2013  (241)</option> <option value='https://www.r-bloggers.com/2013/10/'> October 2013  (234)</option> <option value='https://www.r-bloggers.com/2013/09/'> September 2013  (215)</option> <option value='https://www.r-bloggers.com/2013/08/'> August 2013  (223)</option> <option value='https://www.r-bloggers.com/2013/07/'> July 2013  (254)</option> <option value='https://www.r-bloggers.com/2013/06/'> June 2013  (272)</option> <option value='https://www.r-bloggers.com/2013/05/'> May 2013  (260)</option> <option value='https://www.r-bloggers.com/2013/04/'> April 2013  (279)</option> <option value='https://www.r-bloggers.com/2013/03/'> March 2013  (277)</option> <option value='https://www.r-bloggers.com/2013/02/'> February 2013  (294)</option> <option value='https://www.r-bloggers.com/2013/01/'> January 2013  (343)</option> <option value='https://www.r-bloggers.com/2012/12/'> December 2012  (308)</option> <option value='https://www.r-bloggers.com/2012/11/'> November 2012  (277)</option> <option value='https://www.r-bloggers.com/2012/10/'> October 2012  (308)</option> <option value='https://www.r-bloggers.com/2012/09/'> September 2012  (270)</option> <option value='https://www.r-bloggers.com/2012/08/'> August 2012  (263)</option> <option value='https://www.r-bloggers.com/2012/07/'> July 2012  (247)</option> <option value='https://www.r-bloggers.com/2012/06/'> June 2012  (298)</option> <option value='https://www.r-bloggers.com/2012/05/'> May 2012  (287)</option> <option value='https://www.r-bloggers.com/2012/04/'> April 2012  (295)</option> <option value='https://www.r-bloggers.com/2012/03/'> March 2012  (304)</option> <option value='https://www.r-bloggers.com/2012/02/'> February 2012  (264)</option> <option value='https://www.r-bloggers.com/2012/01/'> January 2012  (280)</option> <option value='https://www.r-bloggers.com/2011/12/'> December 2011  (251)</option> <option value='https://www.r-bloggers.com/2011/11/'> November 2011  (261)</option> <option value='https://www.r-bloggers.com/2011/10/'> October 2011  (281)</option> <option value='https://www.r-bloggers.com/2011/09/'> September 2011  (187)</option> <option value='https://www.r-bloggers.com/2011/08/'> August 2011  (258)</option> <option value='https://www.r-bloggers.com/2011/07/'> July 2011  (219)</option> <option value='https://www.r-bloggers.com/2011/06/'> June 2011  (225)</option> <option value='https://www.r-bloggers.com/2011/05/'> May 2011  (239)</option> <option value='https://www.r-bloggers.com/2011/04/'> April 2011  (268)</option> <option value='https://www.r-bloggers.com/2011/03/'> March 2011  (249)</option> <option value='https://www.r-bloggers.com/2011/02/'> February 2011  (205)</option> <option value='https://www.r-bloggers.com/2011/01/'> January 2011  (209)</option> <option value='https://www.r-bloggers.com/2010/12/'> December 2010  (188)</option> <option value='https://www.r-bloggers.com/2010/11/'> November 2010  (172)</option> <option value='https://www.r-bloggers.com/2010/10/'> October 2010  (219)</option> <option value='https://www.r-bloggers.com/2010/09/'> September 2010  (185)</option> <option value='https://www.r-bloggers.com/2010/08/'> August 2010  (203)</option> <option value='https://www.r-bloggers.com/2010/07/'> July 2010  (175)</option> <option value='https://www.r-bloggers.com/2010/06/'> June 2010  (167)</option> <option value='https://www.r-bloggers.com/2010/05/'> May 2010  (164)</option> <option value='https://www.r-bloggers.com/2010/04/'> April 2010  (152)</option> <option value='https://www.r-bloggers.com/2010/03/'> March 2010  (165)</option> <option value='https://www.r-bloggers.com/2010/02/'> February 2010  (135)</option> <option value='https://www.r-bloggers.com/2010/01/'> January 2010  (121)</option> <option value='https://www.r-bloggers.com/2009/12/'> December 2009  (126)</option> <option value='https://www.r-bloggers.com/2009/11/'> November 2009  (66)</option> <option value='https://www.r-bloggers.com/2009/10/'> October 2009  (87)</option> <option value='https://www.r-bloggers.com/2009/09/'> September 2009  (65)</option> <option value='https://www.r-bloggers.com/2009/08/'> August 2009  (56)</option> <option value='https://www.r-bloggers.com/2009/07/'> July 2009  (64)</option> <option value='https://www.r-bloggers.com/2009/06/'> June 2009  (54)</option> <option value='https://www.r-bloggers.com/2009/05/'> May 2009  (35)</option> <option value='https://www.r-bloggers.com/2009/04/'> April 2009  (38)</option> <option value='https://www.r-bloggers.com/2009/03/'> March 2009  (40)</option> <option value='https://www.r-bloggers.com/2009/02/'> February 2009  (33)</option> <option value='https://www.r-bloggers.com/2009/01/'> January 2009  (42)</option> <option value='https://www.r-bloggers.com/2008/12/'> December 2008  (16)</option> <option value='https://www.r-bloggers.com/2008/11/'> November 2008  (14)</option> <option value='https://www.r-bloggers.com/2008/10/'> October 2008  (10)</option> <option value='https://www.r-bloggers.com/2008/09/'> September 2008  (8)</option> <option value='https://www.r-bloggers.com/2008/08/'> August 2008  (11)</option> <option value='https://www.r-bloggers.com/2008/07/'> July 2008  (7)</option> <option value='https://www.r-bloggers.com/2008/06/'> June 2008  (8)</option> <option value='https://www.r-bloggers.com/2008/05/'> May 2008  (8)</option> <option value='https://www.r-bloggers.com/2008/04/'> April 2008  (4)</option> <option value='https://www.r-bloggers.com/2008/03/'> March 2008  (5)</option> <option value='https://www.r-bloggers.com/2008/02/'> February 2008  (6)</option> <option value='https://www.r-bloggers.com/2008/01/'> January 2008  (10)</option> <option value='https://www.r-bloggers.com/2007/12/'> December 2007  (3)</option> <option value='https://www.r-bloggers.com/2007/11/'> November 2007  (5)</option> <option value='https://www.r-bloggers.com/2007/10/'> October 2007  (9)</option> <option value='https://www.r-bloggers.com/2007/09/'> September 2007  (7)</option> <option value='https://www.r-bloggers.com/2007/08/'> August 2007  (21)</option> <option value='https://www.r-bloggers.com/2007/07/'> July 2007  (9)</option> <option value='https://www.r-bloggers.com/2007/06/'> June 2007  (3)</option> <option value='https://www.r-bloggers.com/2007/05/'> May 2007  (3)</option> <option value='https://www.r-bloggers.com/2007/04/'> April 2007  (1)</option> <option value='https://www.r-bloggers.com/2007/03/'> March 2007  (5)</option> <option value='https://www.r-bloggers.com/2007/02/'> February 2007  (4)</option> <option value='https://www.r-bloggers.com/2006/11/'> November 2006  (1)</option> <option value='https://www.r-bloggers.com/2006/10/'> October 2006  (2)</option> <option value='https://www.r-bloggers.com/2006/08/'> August 2006  (3)</option> <option value='https://www.r-bloggers.com/2006/07/'> July 2006  (1)</option> <option value='https://www.r-bloggers.com/2006/06/'> June 2006  (1)</option> <option value='https://www.r-bloggers.com/2006/05/'> May 2006  (3)</option> <option value='https://www.r-bloggers.com/2006/04/'> April 2006  (1)</option> <option value='https://www.r-bloggers.com/2006/03/'> March 2006  (1)</option> <option value='https://www.r-bloggers.com/2006/02/'> February 2006  (5)</option> <option value='https://www.r-bloggers.com/2006/01/'> January 2006  (1)</option> <option value='https://www.r-bloggers.com/2005/10/'> October 2005  (1)</option> <option value='https://www.r-bloggers.com/2005/09/'> September 2005  (3)</option> <option value='https://www.r-bloggers.com/2005/05/'> May 2005  (1)</option> </select> <script type="text/javascript"> /* <![CDATA[ */ (function() { var dropdown = document.getElementById( "archives-dropdown-3" ); function onSelectChange() { if ( dropdown.options[ dropdown.selectedIndex ].value !== '' ) { document.location.href = this.options[ this.selectedIndex ].value; } } dropdown.onchange = onSelectChange; })(); /* ]]> */ </script> </div><div id="linkcat-3349" class="sb-widget widget_links"><h4 class="widget-title">Other sites</h4> <ul class='xoxo blogroll'> <li><a href="https://www.r-users.com/">Jobs for R-users</a></li> <li><a href="http://www.proc-x.com/" title="SAS news gathered from bloggers">SAS blogs</a></li> </ul> </div> </aside></div> </div> <div class="copyright-wrap"> <p class="copyright">Copyright © 2020 | <a href="https://www.mhthemes.com/" rel="nofollow">MH Corporate basic by MH Themes</a></p> </div> </div> <!-- TPC! Memory Usage (http://webjawns.com) Memory Usage: 73480936 Memory Peak Usage: 73596840 WP Memory Limit: 820M PHP Memory Limit: 800M Checkpoints: 9 --> <!-- Schema & Structured Data For WP v1.9.49.1 - --> <script type="application/ld+json" class="saswp-schema-markup-output"> [{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"https:\/\/www.r-bloggers.com#Organization","name":"R-bloggers","url":"http:\/\/www.r-bloggers.com","sameAs":[],"logo":{"@type":"ImageObject","url":"http:\/\/www.r-bloggers.com\/wp-content\/uploads\/2020\/07\/R_blogger_logo_02.png","width":"1061","height":"304"},"contactPoint":{"@type":"ContactPoint","contactType":"technical support","telephone":"","url":"https:\/\/www.r-bloggers.com\/contact-us\/"}},{"@type":"WebSite","@id":"https:\/\/www.r-bloggers.com#website","headline":"R-bloggers","name":"R-bloggers","description":"R news and tutorials contributed by hundreds of R bloggers","url":"https:\/\/www.r-bloggers.com","potentialAction":{"@type":"SearchAction","target":"https:\/\/www.r-bloggers.com\/?s={search_term_string}","query-input":"required name=search_term_string"},"publisher":{"@id":"https:\/\/www.r-bloggers.com#Organization"}},{"@context":"https:\/\/schema.org","@type":"WebPage","@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#webpage","name":"R Posts You Might Have Missed! | R-bloggers","url":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/","lastReviewed":"2020-07-10T18:00:00-06:00","reviewedBy":{"@type":"Organization","logo":{"@type":"ImageObject","url":"http:\/\/www.r-bloggers.com\/wp-content\/uploads\/2020\/07\/R_blogger_logo_02.png","width":"1061","height":"304"},"name":"R-bloggers"},"inLanguage":"en-US","description":"TL;DR\n\nI wanted something that goes some way to automating my own\ntime-consuming process of scrolling twitter for cool things to read. I\nthought a few other people might feel somewhat similar, so I decided to\nbuild a feed.\n\nR posts you might have...","primaryImageOfPage":{"@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#primaryimage"},"mainContentOfPage":[[{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"Home","url":"https:\/\/www.r-bloggers.com"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"About","url":"http:\/\/www.r-bloggers.com\/about\/"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"RSS","url":"https:\/\/feeds.feedburner.com\/RBloggers"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"add your blog!","url":"http:\/\/www.r-bloggers.com\/add-your-blog\/"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"Learn R","url":"https:\/\/www.r-bloggers.com\/how-to-learn-r-2\/"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"R jobs","url":"https:\/\/www.r-users.com\/"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"Submit a new job (it's free)","url":"https:\/\/www.r-users.com\/submit-job\/"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"Browse latest jobs (also free)","url":"https:\/\/www.r-users.com\/"},{"@context":"https:\/\/schema.org","@type":"SiteNavigationElement","@id":"https:\/\/www.r-bloggers.com\/#top nav","name":"Contact us","url":"http:\/\/www.r-bloggers.com\/contact-us\/"}]],"isPartOf":{"@id":"https:\/\/www.r-bloggers.com#website"},"breadcrumb":{"@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#breadcrumb"}},{"@type":"BreadcrumbList","@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/www.r-bloggers.com","name":"R-bloggers"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/www.r-bloggers.com\/category\/r-bloggers\/","name":"R bloggers"}},{"@type":"ListItem","position":3,"item":{"@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/","name":"R Posts You Might Have Missed! | R-bloggers"}}]},{"@type":"Article","@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#article","url":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/","inLanguage":"en-US","mainEntityOfPage":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#webpage","headline":"R Posts You Might Have Missed! | R-bloggers","description":"TL;DR\n\nI wanted something that goes some way to automating my own\ntime-consuming process of scrolling twitter for cool things to read. I\nthought a few other people might feel somewhat similar, so I decided to\nbuild a feed.\n\nR posts you might have...","articleBody":"TL;DR I wanted something that goes some way to automating my own time-consuming process of scrolling twitter for cool things to read. I thought a few other people might feel somewhat similar, so I decided to build a feed. R posts you might have missed is an semi-automated twitter account posting recent R-related content. The goal is to make it easier to keep up with the most important packages and news from the community. Links to relevant and popular resources are gathered from twitter and the R blogosphere before being processed and lightly curated. Read on to learn the origin story of the account, how it works and what comes next! News overload! Keeping track of new developments in the data science, open source and R communities is hard. The number of active developers, application areas and R packages is exploding. Ever since I started writing R code I\u2019ve found it hard to avoid reinventing solutions to problems that are already solved by other developers, usually through ignorance of those developments. Being up-to-date with recent developments equips you with options that can change the way you approach a new problem. This is more or less the reason I still use twitter, because it\u2019s still the place where a majority of R developers hang out and share their projects and ideas. The problem is that the volume of new stuff is just too large - and I could easily spend endless hours per week scrolling twitter, discovering and re-discovering new stuff (and getting very distracted in the process). This is compounded by twitter\u2019s news feed algorithm which I think has made it even harder to develop a tailored feed. So what can you do? Well you\u2019ve got options of course. R Bloggers has been around for some time and aggregates the feeds of several hundred well-known R blogs. I\u2019ve never found this solves my problem: blog articles are one type of content, but there are many other types of content that I\u2019d like to see in the same place, and most of them do not have RSS feeds. The site itself carries a lot of banner ads and doesn\u2019t render articles very nicely - although those may be minor considerations if you still use an RSS reader to access the posts. Ok so what else? R-Weekly is a terrific resource. The team gather links to posts, packages, community news and tweets into a single weekly digest. I think R Weekly is a wonderful resource, and I still read it every week - it does a particularly good job of creating a nicely formatted list broken into content types and topics that were active in the last week. However, this doesn\u2019t scratch my itch completely. One issue is that it\u2019s not totally automated (AFAIK, please correct me if that\u2019s false), and there\u2019s always the risk that something gets excluded. Additionally - any news oriented resource focusses on what\u2019s occurred most recently (of course, yeah I know) and by definition excludes older useful resources that keep resurfacing. I think it\u2019s good for those things to continue to get air-time - particularly because if I\u2019m not working on a specific topic at the time of the initial news announcement, I\u2019ll probably forget about it. Or more likely I just missed the announcement to begin with. I think repeated exposure and reminders can be important. Long story short, I wanted something that goes some way to automating my own time-consuming process of scrolling twitter for cool things to read. I thought a few other people might feel somewhat similar, so I decided to build a feed. R posts you might have missed R posts you might have missed is a twitter feed with the following attributes: Publishes about 10 posts per day Posts are usually blog posts, repos and tutorials containing R code Emphasis on non-commercial content that is free to access Lightly curated with a lean towards more recent posts and repos Ensure the author is directly credited in each post How does it work? The recipe underpinning the feed takes the following steps: 1. Gather links from #rstats twitter Use Michael Kearney\u2019s rtweet package to gather recent #rstats tagged tweets from twitter (last 9 days) Also use rtweet to gather tweets from a subset of highly active users - not all of these are necessarily #rstats tagged Extract the urls embedded inside the tweets 2. Gather new post urls from RSS feeds Use Robert Myles McDonnell\u2019s tidyRSS package to read a large number of RSS feeds. Extract the urls of posts published in the last week that include code chunks 3. Read and filter urls based on content Steps 1. and 2. usually result in around 2000 urls per week. Use htmldf to download page content from the urls. Filter out any pages that don\u2019t have code tags in the source and that haven\u2019t already been tweeted by R posts you might have missed recently. Filter out any commercial content, anything that looks spammy. This uses some simple lists of sites to exclude. Medium posts are also completely filtered out - Medium paywalls it\u2019s content, and also tends to have lower quality content in general. Extract page titles from <meta>, <title> or <h1> tags. For github repos, extract repo descriptions. These are used for composing tweets. After reading and filtering, we\u2019re usually down to about 300 possible resources and urls we could tweet. For each of the 300 pages, extract image urls on each page (images are selected manually in the next step). Download and convert any images that are base64 or SVG encoded to png (twitter doesn\u2019t accept these file types in tweets). 4. Find the author\u2019s twitter username Usually, bloggers declare their social media profile information on their blogs. If this is the case, htmldf does a reasonable job of finding these automatically in the html. Author credentials are a bit trickier for github repos. Sometimes, this is directly embedded on the user\u2019s GH profile - so all we need to do is visit the profile associated with the repo, and fetch the credentials from there. Sometimes twitter credentials aren\u2019t provided here, but a personal website is declared on the GH profile where twitter profiles can be found. 80% of the time it seems that about 80% of R users twitter details can be gathered this way from their GH profile. Hello?\\! Is it me you\u2019re looking for? 5. Compose tweets using an interactive shiny app Everything until this point is totally automatic and carried out using a batch process on a cheap Google VM. Now the tweets are composed from various ingredients that have been gathered. To do this, a simple GUI built using R shiny, provides a simple editing environment to choose the correct author credentials, choose an image to show with the post and to check for any errors or formatting issues. For each tweet: Check the authorship from a list of options gathered in the previous scraping steps. Check the title, check emoji and choose a display image. Filter out tweets that aren\u2019t relevant. Save the tweets to .csv: this includes columns for scheduled time (a randomly generated time in the week following Sys.time()), tweet text and image url. A hideously basic shiny app for choosing images and author names. It\u2019s simple but does the job\\! 6. Post! Bulk upload the processed tweets to a scheduling service - I use OneUpApp who are particularly flexible with bulk uploads and cross-posting to other social networks. This is a tweet scheduling service. There are many like it, but this one is mine. What next? There\u2019s a lot to do. In the short-term the intention is to Reduce the effort involved in manual curation. The curation process takes about an hour for a week\u2019s worth of R tweets, most of that time is checking author credentials are correct and that the urls contain high-quality content. A bit more NLP could help with both of these tasks. Improve cross-posted author tagging for LinkedIn and Facebook posts. At present, full user credentials only appear on the twitter posts. It doesn\u2019t seem to be possible\/easy to schedule posts to LinkedIn with profile tags, where the author\u2019s LinkedIn profile is known. Incorporate R-adjacent content. All of the candidate posts either contain code tags in the html, or are github repositories. Posts that are about R and data science but don\u2019t include any code (like this one) are automatically excluded. It would be a big step to automatically identify and include these pages too. Are you a data scientist with an interest in Python? We\u2019ve got you covered! Comments? Suggestions? Issues? Feedback is very welcome! Do you find R posts you might have missed useful? What do you like? How would you improve it? Find me on twitter at rushworth_a or write a github issue here.","keywords":"","datePublished":"2020-07-10T18:00:00-06:00","dateModified":"2020-07-10T18:00:00-06:00","author":{"@type":"Person","name":"Alastair Rushworth","description":"","url":"https:\/\/www.r-bloggers.com\/author\/alastair-rushworth\/","sameAs":["https:\/\/alastairrushworth.github.io\/"],"image":{"@type":"ImageObject","url":"https:\/\/secure.gravatar.com\/avatar\/86007718196c4bb8a2a5c2ada743849d?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@id":"https:\/\/www.r-bloggers.com#Organization"},"image":[{"@type":"ImageObject","url":"https:\/\/alastairrushworth.github.io\/assets\/images\/r_logo_final.jpg","width":3000,"height":3000,"@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#primaryimage"},{"@type":"ImageObject","url":"https:\/\/alastairrushworth.github.io\/assets\/images\/information_overload.gif","width":480,"height":378},{"@type":"ImageObject","url":"https:\/\/alastairrushworth.github.io\/assets\/images\/gh_profile.png","width":2428,"height":1192},{"@type":"ImageObject","url":"https:\/\/alastairrushworth.github.io\/assets\/images\/app_gif.gif","width":640,"height":325},{"@type":"ImageObject","url":"https:\/\/alastairrushworth.github.io\/assets\/images\/oneupapp.png","width":2340,"height":820}],"isPartOf":{"@id":"https:\/\/www.r-bloggers.com\/2020\/07\/r-posts-you-might-have-missed\/#webpage"}}]}] </script> <script> var snp_f = []; var snp_hostname = new RegExp(location.host); var snp_http = new RegExp("^(http|https)://", "i"); var snp_cookie_prefix = ''; var snp_separate_cookies = false; var snp_ajax_url = 'https://www.r-bloggers.com/wp-admin/admin-ajax.php'; var snp_ajax_nonce = '381996bdf4'; var snp_ignore_cookies = false; var snp_enable_analytics_events = false; var snp_enable_mobile = false; var snp_use_in_all = false; var snp_excluded_urls = []; snp_excluded_urls.push(''); </script> <div class="snp-root"> <input type="hidden" id="snp_popup" value="" /> <input type="hidden" id="snp_popup_id" value="" /> <input type="hidden" id="snp_popup_theme" value="" /> <input type="hidden" id="snp_exithref" value="" /> <input type="hidden" id="snp_exittarget" value="" /> <div id="snppopup-welcome" class="snp-pop-109583 snppopup"><input type="hidden" class="snp_open" value="scroll" /><input type="hidden" class="snp_show_on_exit" value="2" /><input type="hidden" class="snp_exit_js_alert_text" value="" /><input type="hidden" class="snp_exit_scroll_down" value="" /><input type="hidden" class="snp_exit_scroll_up" value="" /><input type="hidden" class="snp_open_scroll" value="50" /><input type="hidden" class="snp_optin_redirect_url" value="" /><input type="hidden" class="snp_show_cb_button" value="yes" /><input type="hidden" class="snp_popup_id" value="109583" /><input type="hidden" class="snp_popup_theme" value="theme6" /><input type="hidden" class="snp_overlay" value="disabled" /><input type="hidden" class="snp_cookie_conversion" value="30" /><input type="hidden" class="snp_cookie_close" value="180" /><div class="snp-fb snp-theme6"> <div class="snp-subscribe-inner"> <h1 class="snp-header"><i>Never miss an update! </i> <br/> <strong>Subscribe to R-bloggers</strong> to receive <br/>e-mails with the latest R posts.<br/> <small>(You will not see this message again.)</small></h1> <div class="snp-form"> <form action="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" method="post" class="snp-subscribeform snp_subscribeform"> <fieldset> <div class="snp-field"> <input type="text" name="email" id="snp_email" placeholder="Your E-mail..." class="snp-field snp-field-email" /> </div> <button type="submit" class="snp-submit">Submit</button> </fieldset> </form> </div> <a href="#" class="snp_nothanks snp-close">Click here to close (This popup will not appear again)</a> </div> </div> <style>.snp-pop-109583 .snp-theme6 { max-width: 700px;} .snp-pop-109583 .snp-theme6 h1 {font-size: 17px;} .snp-pop-109583 .snp-theme6 { color: #a0a4a9;} .snp-pop-109583 .snp-theme6 .snp-field ::-webkit-input-placeholder { color: #a0a4a9;} .snp-pop-109583 .snp-theme6 .snp-field :-moz-placeholder { color: #a0a4a9;} .snp-pop-109583 .snp-theme6 .snp-field :-ms-input-placeholder { color: #a0a4a9;} .snp-pop-109583 .snp-theme6 .snp-field input { border: 1px solid #a0a4a9;} .snp-pop-109583 .snp-theme6 .snp-field { color: #000000;} .snp-pop-109583 .snp-theme6 { background: #f2f2f2;} </style><script> jQuery(document).ready(function() { }); </script> </div> <script type="text/javascript"> var CaptchaCallback = function() { jQuery('.g-recaptcha').each(function(index, el) { grecaptcha.render(el, { 'sitekey' : '' }); }); }; </script> </div> <script type="text/javascript">/* <![CDATA[ */!function(e,n){var r={"selectors":{"block":"pre","inline":"code"},"options":{"indent":4,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"scroll","linenumbers":false,"theme":"enlighter","language":"r","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""},"resources":["https:\/\/www.r-bloggers.com\/wp-content\/plugins\/enlighter\/cache\/enlighterjs.min.css?vVCnEZeurtkU0vr","https:\/\/www.r-bloggers.com\/wp-content\/plugins\/enlighter\/\/resources\/enlighterjs\/enlighterjs.min.js"]},o=document.getElementsByTagName("head")[0],t=n&&(n.error||n.log)||function(){};e.EnlighterJSINIT=function(){!function(e,n){var r=0,l=null;function c(o){l=o,++r==e.length&&(!0,n(l))}e.forEach(function(e){switch(e.match(/\.([a-z]+)(?:[#?].*)?$/)[1]){case"js":var n=document.createElement("script");n.onload=function(){c(null)},n.onerror=c,n.src=e,n.async=!0,o.appendChild(n);break;case"css":var r=document.createElement("link");r.onload=function(){c(null)},r.onerror=c,r.rel="stylesheet",r.type="text/css",r.href=e,r.media="all",o.appendChild(r);break;default:t("Error: invalid file extension",e)}})}(r.resources,function(e){e?t("Error: failed to dynamically load EnlighterJS resources!",e):"undefined"!=typeof EnlighterJS?EnlighterJS.init(r.selectors.block,r.selectors.inline,r.options):t("Error: EnlighterJS resources not loaded yet!")})},(document.querySelector(r.selectors.block)||document.querySelector(r.selectors.inline))&&e.EnlighterJSINIT()}(window,console); /* ]]> */</script><script type='text/javascript' src='https://www.r-bloggers.com/wp-content/plugins/arscode-ninja-popups/js/jquery.ck.min.js?ver=5.5.1' id='jquery-np-cookie-js'></script> <script type='text/javascript' src='https://www.r-bloggers.com/wp-content/plugins/arscode-ninja-popups/js/dialog_trigger.js?ver=5.5.1' id='js-dialog_trigger-js'></script> <script type='text/javascript' src='https://www.r-bloggers.com/wp-content/plugins/arscode-ninja-popups/js/ninjapopups.min.js?ver=5.5.1' id='js-ninjapopups-js'></script> <script type='text/javascript' src='https://www.r-bloggers.com/wp-content/plugins/arscode-ninja-popups/fancybox2/jquery.fancybox.min.js?ver=5.5.1' id='fancybox2-js'></script> <script type='text/javascript' src='https://c0.wp.com/p/jetpack/7.3.2/_inc/build/photon/photon.min.js' id='jetpack-photon-js'></script> <script type='text/javascript' id='flying-pages-js-before'> window.FPConfig= { delay: 0, ignoreKeywords: ["\/wp-admin","\/wp-login.php","\/cart","add-to-cart","logout","#","?",".png",".jpeg",".jpg",".gif",".svg"], maxRPS: 3, hoverDelay: 50 }; </script> <script type='text/javascript' src='https://www.r-bloggers.com/wp-content/plugins/flying-pages/flying-pages.min.js?ver=2.4.2' id='flying-pages-js' defer></script> <script type='text/javascript' src='https://s0.wp.com/wp-content/js/devicepx-jetpack.js?ver=202040' id='devicepx-js'></script> <script type='text/javascript' src='https://c0.wp.com/p/jetpack/7.3.2/_inc/build/lazy-images/js/lazy-images.min.js' id='jetpack-lazy-images-js'></script> <script type='text/javascript' src='https://c0.wp.com/c/5.5.1/wp-includes/js/wp-embed.min.js' id='wp-embed-js'></script> <script type='text/javascript' src='https://stats.wp.com/e-202040.js' async='async' defer='defer'></script> <script type='text/javascript'> _stq = window._stq || []; _stq.push([ 'view', {v:'ext',j:'1:7.3.2',blog:'11524731',post:'199666',tz:'-6',srv:'www.r-bloggers.com'} ]); _stq.push([ 'clickTrackerInit', '11524731', '199666' ]); </script> <script type="text/javascript"> jQuery(document).ready(function ($) { //$( document ).ajaxStart(function() { //}); for (var i = 0; i < document.forms.length; ++i) { var form = document.forms[i]; if ($(form).attr("method") != "get") { $(form).append('<input type="hidden" name="PnM-zH_AKJNfBeFs" value="v*TMZOlu5zynohG6" />'); } if ($(form).attr("method") != "get") { $(form).append('<input type="hidden" name="-cRxUiIS" value="6UaC7c1T" />'); } if ($(form).attr("method") != "get") { $(form).append('<input type="hidden" name="VXUxhtONi" value="Nc8akts2n" />'); } if ($(form).attr("method") != "get") { $(form).append('<input type="hidden" name="GyoDAYLMZ" value="yE2gzT5Zm" />'); } } $(document).on('submit', 'form', function () { if ($(this).attr("method") != "get") { $(this).append('<input type="hidden" name="PnM-zH_AKJNfBeFs" value="v*TMZOlu5zynohG6" />'); } if ($(this).attr("method") != "get") { $(this).append('<input type="hidden" name="-cRxUiIS" value="6UaC7c1T" />'); } if ($(this).attr("method") != "get") { $(this).append('<input type="hidden" name="VXUxhtONi" value="Nc8akts2n" />'); } if ($(this).attr("method") != "get") { $(this).append('<input type="hidden" name="GyoDAYLMZ" value="yE2gzT5Zm" />'); } return true; }); jQuery.ajaxSetup({ beforeSend: function (e, data) { //console.log(Object.getOwnPropertyNames(data).sort()); //console.log(data.type); if (data.type !== 'POST') return; if (typeof data.data === 'object' && data.data !== null) { data.data.append("PnM-zH_AKJNfBeFs", "v*TMZOlu5zynohG6"); data.data.append("-cRxUiIS", "6UaC7c1T"); data.data.append("VXUxhtONi", "Nc8akts2n"); data.data.append("GyoDAYLMZ", "yE2gzT5Zm"); } else { data.data = data.data + '&PnM-zH_AKJNfBeFs=v*TMZOlu5zynohG6&-cRxUiIS=6UaC7c1T&VXUxhtONi=Nc8akts2n&GyoDAYLMZ=yE2gzT5Zm'; } } }); }); </script> </body> </html> <!-- Dynamic page generated in 0.992 seconds. --> <!-- Cached page generated by WP-Super-Cache on 2020-09-28 03:56:48 --> <!-- Compression = gzip -->