

{"id":12103,"date":"2019-03-19T00:40:25","date_gmt":"2019-03-19T05:40:25","guid":{"rendered":"https:\/\/rud.is\/b\/?p=12103"},"modified":"2019-03-19T00:40:25","modified_gmt":"2019-03-19T05:40:25","slug":"assumptions-matter-more-than-dependencies","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/","title":{"rendered":"Assumptions Matter More Than Dependencies"},"content":{"rendered":"<p>There&#8217;s been alot of talk about &#8220;dependencies&#8221; in the R universe of late. This is not really a post about that but more of a &#8220;really, don&#8217;t do this&#8221; if you decide you want to poke the dependency bear by trying to build a deeply flawed model off of CRAN package metadata.<\/p>\n<p>CRAN packages undergo checks. Here&#8217;s <a href=\"https:\/\/cran.rstudio.com\/web\/checks\/check_results_akima.html\">one for <code>akima<\/code><\/a> (I :heart: me some gridded interpolation functions, plus this package is not in any hot-button R tribe right now):<\/p>\n<table border=\"1\" summary=\"CRAN check results for package akima\">\n<tr>\n<th> Flavor <\/th>\n<th> Version <\/th>\n<th> T<sub>install<\/sub> <\/th>\n<th> T<sub>check<\/sub> <\/th>\n<th> T<sub>total<\/sub> <\/th>\n<th> Status <\/th>\n<th> Flags <\/th>\n<\/tr>\n<tr>\n<td>   r-devel-linux-x86_64-debian-clang  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 9.83 <\/td>\n<td class=\"r\"> 32.67 <\/td>\n<td class=\"r\"> 42.50 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-devel-linux-x86_64-debian-clang\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-devel-linux-x86_64-debian-gcc  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 8.53 <\/td>\n<td class=\"r\"> 26.56 <\/td>\n<td class=\"r\"> 35.09 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-devel-linux-x86_64-debian-gcc\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-devel-linux-x86_64-fedora-clang  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\"> 53.33 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-devel-linux-x86_64-fedora-clang\/akima-00check.html\">NOTE <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-devel-linux-x86_64-fedora-gcc  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\"> 51.03 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-devel-linux-x86_64-fedora-gcc\/akima-00check.html\">NOTE <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-devel-windows-ix86+x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 53.00 <\/td>\n<td class=\"r\"> 76.00 <\/td>\n<td class=\"r\"> 129.00 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-devel-windows-ix86+x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-patched-linux-x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 9.26 <\/td>\n<td class=\"r\"> 28.32 <\/td>\n<td class=\"r\"> 37.58 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-patched-linux-x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-patched-solaris-x86  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\"> 66.20 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-patched-solaris-x86\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-release-linux-x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 8.59 <\/td>\n<td class=\"r\"> 28.25 <\/td>\n<td class=\"r\"> 36.84 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-release-linux-x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-release-windows-ix86+x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 39.00 <\/td>\n<td class=\"r\"> 69.00 <\/td>\n<td class=\"r\"> 108.00 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-release-windows-ix86+x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-release-osx-x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-release-osx-x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-oldrel-windows-ix86+x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\"> 28.00 <\/td>\n<td class=\"r\"> 71.00 <\/td>\n<td class=\"r\"> 99.00 <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-oldrel-windows-ix86+x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<tr>\n<td>   r-oldrel-osx-x86_64  <\/td>\n<td> 0.6-2 <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td class=\"r\">  <\/td>\n<td> <a href=\"https:\/\/www.R-project.org\/nosvn\/R.check\/r-oldrel-osx-x86_64\/akima-00check.html\"><span class=\"check_ok\">OK<\/span> <\/td>\n<td>  <\/td>\n<\/tr>\n<\/table>\n<pre>Check Details\nVersion: 0.6-2\n  Check: compiled code\n Result: NOTE\n\n    File \u2018akima\/libs\/akima.so\u2019:\n      Found no call to: \u2018R_useDynamicSymbols\u2019\n\n    It is good practice to register native routines and to disable symbol search.\n\n    See \u2018Writing portable packages\u2019 in the \u2018Writing R Extensions\u2019 manual.<\/pre>\n<p>The <code>Status<\/code> field can be &#8220;OK&#8221;, &#8220;NOTE&#8221;, &#8220;WARN[ING]&#8221;, &#8220;ERROR&#8221;, or &#8220;FAIL&#8221;.<\/p>\n<p>You&#8217;ll also note that there are checks for a future, even cooler R (&#8220;devel&#8221;), spiffy R (&#8220;release&#8221;\/&#8221;patched&#8221;) and :yawn: R (&#8220;oldrel&#8221;). Remember those, they are important.<\/p>\n<p>Now, let&#8217;s say you wanted to perform an honest appraisal of whether packages with more dependencies are more likely to have one or more &#8220;bad&#8221; CRAN check conditions. You&#8217;d likely lump &#8220;NOTE&#8221; with &#8220;OK&#8221; and not mark that particular check against the package. That leaves &#8220;WARN[ING]&#8221; (the reason for the [ING] is that different check RDS files include\/forego the [ING]\u2026yay consistency?) &#8220;ERROR&#8221; and &#8220;FAIL&#8221;. Obviously we can just use those without further concern, right?<\/p>\n<h3>WARN[ING] Will Robinson!<\/h3>\n<p>You can get a copy of the check details at <a href=\"https:\/\/cran.r-project.org\/web\/checks\/check_details.rds\">https:\/\/cran.r-project.org\/web\/checks\/check_details.rds<\/a>. I happen to have a local copy (used &#8220;Mar 18 02:47&#8221; version) now that my CRAN mirror is re-humming along nicely again. Let&#8217;s make sure it&#8217;s being read in OK:<\/p>\n<pre><code class=\"language-r\">library(tidyverse)\n\ndet &lt;- as_tibble(readRDS(\"check_details.rds\")) # it's got tons of classes &amp; I like readable data frame prints\n\nnrow(distinct(det, Package))\n## [1] 13094\n<\/code><\/pre>\n<p>OK, that number tracks with the count as of the last rsync. So, what do these WARN[ING]s look like?<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"WARNING\") %&gt;% \n  select(Output)\n## # A tibble: 2,299 x 1\n##    Output                                                             \n##    &lt;chr&gt;                                                              \n##  1 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n##  2 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n##  3 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n##  4 \"Warning in parse(file = files, n = -1L) :\\n  invalid input found \u2026\n##  5 \"Warning in parse(file = files, n = -1L) :\\n  invalid input found \u2026\n##  6 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n##  7 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n##  8 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n##  9 \"Found the following significant warnings:\\n  track_methods.cpp:22\u2026\n## 10 \"Found the following significant warnings:\\n  Warning: unable to r\u2026\n## # \u2026 with 2,289 more rows\n<\/code><\/pre>\n<p>EEK! Well, actually not really. The checks are automated and we can use some substring machinations to try to get better groups:<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"WARNING\") %&gt;% \n  mutate(bits = substring(trimws(Output), 1, 30)) %&gt;% \n  count(bits, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n))\n## # A tibble: 29 x 3\n##    bits                                  n     pct\n##    &lt;chr&gt;                             &lt;int&gt;   &lt;dbl&gt;\n##  1 Found the following significan     1316 0.572  \n##  2 Error in re-building vignettes      702 0.305  \n##  3 Error(s) in re-building vignet       90 0.0391 \n##  4 Output from running autoreconf       56 0.0244 \n##  5 Warning in parse(file = files,       37 0.0161 \n##  6 Missing link or links in docum       15 0.00652\n##  7 \"network.dyadcount:\\n  function(\"    10 0.00435\n##  8 Found the following executable        9 0.00391\n##  9 dyld: Library not loaded: \/Bui        8 0.00348\n## 10 Errors in running code in vign        8 0.00348\n## # \u2026 with 19 more rows\n<\/code><\/pre>\n<p>OK, so <em>some<\/em> &#8220;eeking&#8221; is warranted for those &#8220;significant&#8221; ones but thirty percent of these findings are about vignettes. Sure, vignettes are important and ideally they build fine but there are <em>tons<\/em> of reasons they don&#8217;t on CRAN&#8217;s ever-changing infrastructure. I say they need to be excluded. Drop a note in the comments with a different opinion since <em>this is an analyst&#8217;s opinion<\/em>. But I happen to know CRAN <em>really<\/em> well and would seriously suggest that in the context of the <em>question<\/em> regarding high dependency package efficacy that this should be ignored unless further investigated individually.<\/p>\n<p>So, where are these &#8220;significant&#8221; WARN[ING]s?<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"WARNING\") %&gt;% \n  filter(grepl(\"significant\", Output, ignore.case = TRUE)) %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  count(flavor_flav, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n))\n## # A tibble: 3 x 3\n##   flavor_flav     n   pct\n##   &lt;chr&gt;       &lt;int&gt; &lt;dbl&gt;\n## 1 devel         904 0.686\n## 2 current       280 0.213\n## 3 oldrel        133 0.101\n<\/code><\/pre>\n<p>I posit that if the goal really is to create a model to help decide whether you should take on the risk of packages with multiple++ dependencies you cannot include &#8220;devel&#8221;. Nobody sane runs &#8220;devel&#8221; in production and that&#8217;s the real goal: a safe production environment. So you literally have to throw out 68% of these, too (some folks are stuck on :yawn: &#8220;oldrel&#8221; R in orgs with draconian IT practices or fragile workflow systems). We&#8217;re not at &#8220;0&#8221; yet so what are some of these issues?<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"WARNING\") %&gt;% \n  filter(grepl(\"significant\", Output, ignore.case = TRUE)) %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  filter(flavor_flav != \"devel\") %&gt;% \n  mutate(Output = gsub(\"Found the following significant warnings:\\n  \", \"\", trimws(Output))) %&gt;% \n  mutate(bits = substring(trimws(Output), 1, 50)) %&gt;% \n  count(bits, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n))\n## # A tibble: 110 x 3\n##    bits                                                      n     pct\n##    &lt;chr&gt;                                                 &lt;int&gt;   &lt;dbl&gt;\n##  1 \"Warning: S3 methods '[.fun_list', '[.grouped_df', \"    158 0.383  \n##  2 Warning: 'rgl_init' failed, running with rgl.useNU       60 0.145  \n##  3 \"Found the following significant warnings:\\n\\n  Warn\u2026     9 0.0218 \n##  4 Warning: package \u2018dplyr\u2019 was built under R version        9 0.0218 \n##  5 \"bgc_hmm.c:241:31: warning: \u2018, \u2019 directive writing \"      4 0.00969\n##  6 driver.c:381:26: warning: cast from pointer to int        4 0.00969\n##  7 hash.c:144:5: warning: \u2018strncpy\u2019 specified bound 2        4 0.00969\n##  8 RngStream.c:347:4: warning: \u2018strncpy\u2019 specified bo        4 0.00969\n##  9 Warning: \u2018__var_1_mmb.offset\u2019 is used uninitialize        4 0.00969\n## 10 \/home\/hornik\/tmp\/R.check\/r-patched-gcc\/Work\/build\/        3 0.00726\n## # \u2026 with 100 more rows\n<\/code><\/pre>\n<p>Fun fact: a re-run of this with a 2019-03-19 RDS pulled from CRAN shows 79 vs 158 (and those 79 packages were&#8217;t magically re-submitted). This is usually a CRAN check &#8220;hiccup&#8221; on Windows:<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"WARNING\") %&gt;% \n  filter(grepl(\"significant\", Output, ignore.case = TRUE)) %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  filter(flavor_flav != \"devel\") %&gt;% \n  mutate(Output = gsub(\"Found the following significant warnings:\\n  \", \"\", trimws(Output))) %&gt;% \n  mutate(bits = substring(trimws(Output), 1, 50)) %&gt;% \n  filter(grepl(\"S3 methods\", bits)) %&gt;% \n  count(bits, Flavor, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n))\n## # A tibble: 6 x 4\n##   bits                               Flavor                  n     pct\n##   &lt;chr&gt;                              &lt;chr&gt;               &lt;int&gt;   &lt;dbl&gt;\n## 1 \"Warning: S3 methods '[.fun_list'\u2026 r-oldrel-windows-i\u2026    79 0.485  \n## 2 \"Warning: S3 methods '[.fun_list'\u2026 r-release-windows-\u2026    79 0.485  \n## 3 Warning: S3 methods 'as_mapper.ch\u2026 r-oldrel-windows-i\u2026     2 0.0123 \n## 4 Warning: S3 methods '.DollarNames\u2026 r-oldrel-windows-i\u2026     1 0.00613\n## 5 Warning: S3 methods 'as.promise.F\u2026 r-release-windows-\u2026     1 0.00613\n## 6 Warning: S3 methods 'format.stati\u2026 r-oldrel-windows-i\u2026     1 0.00613\n<\/code><\/pre>\n<p>Yep! So, we really have to ignore some portion of these but not many (remember, these are test counts, not package counts).<\/p>\n<p>Perhaps we&#8217;ll have better luck <strike>ginning up the analysis<\/strike> focusing on &#8220;ERROR&#8221;!<\/p>\n<h3>To ERROR Is Definitely Human When Assumptions Are Flawed<\/h3>\n<p>Let&#8217;s see about these ERRORs:<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"ERROR\") %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  filter(flavor_flav != \"devel\") %&gt;% \n  mutate(bits = substring(trimws(Output), 1, 20)) %&gt;% \n  count(bits, sort=TRUE) %&gt;% \n  print(n=66)\n## # A tibble: 66 x 2\n##    bits                        n\n##    &lt;chr&gt;                   &lt;int&gt;\n##  1 Installation failed.      437\n##  2 \"Running examples in \"    424\n##  3 Package required but      213\n##  4 Running \u2018testthat.R\u2019      150\n##  5 Packages required bu      102\n##  6 Running 'testthat.R'       58\n##  7 Package required and       31\n##  8 Running \u2018test-all.R\u2019       17\n##  9 Packages required an       12\n## 10 Errors in running co        7\n## 11 Running \u2018spelling.R\u2019        6\n## 12 Running \u2018test-that.R        5\n## 13 Running 'activate_te        4\n## 14 Running 'test-all.R'        4\n## 15 Running \u2018activate_te        3\n## 16 Running 'Bernstein-E        2\n## 17 Running 'Class+Meth.        2\n## 18 Running 'dist_matrix        2\n## 19 Running 'Frechet-tes        2\n## 20 Running 'spelling.R'        2\n## 21 Running 'test-as-dgC        2\n## 22 Running 'valued_fit.        2\n## 23 Running \u2018allier.R\u2019 [        2\n## 24 Running \u2018aunitizer.R        2\n## 25 Running \u2018autoprint.R        2\n## 26 \"Running \u2018bdstest.R\u2019 \"      2\n## 27 Running \u2018build-tools        2\n## 28 Running \u2018exporting-m        2\n## 29 Running \u2018restfulr_un        2\n## 30 Running \u2018run_test.R\u2019        2\n## 31 Running \u2018test_change        2\n## 32 Running \u2018test-as-dgC        2\n## 33 Running \u2018testGBHProc        2\n## 34 Running \u2018tests-nlgam        2\n## 35 Running \u2018testthat-pr        2\n## 36 Running \u2018TimeIn_Data        2\n## 37 Running '000.session        1\n## 38 Running '001.setupEx        1\n## 39 Running 'bug1.R' [1s        1\n## 40 \"Running 'failure.R' \"      1\n## 41 Running 'fold.R' [5s        1\n## 42 Running 'Rgui.R' [3s        1\n## 43 Running 'Rgui.R' [4s        1\n## 44 Running 'SP500-ex.R'        1\n## 45 Running \u2018aggregate.R        1\n## 46 Running \u2018as.edgelist        1\n## 47 \"Running \u2018bdstest.R\u2019\\n\"     1\n## 48 Running \u2018Class+Meth.        1\n## 49 \"Running \u2018config.R\u2019\\n \"     1\n## 50 Running \u2018cX-ui-funct        1\n## 51 Running \u2018DevEvalFile        1\n## 52 \"Running \u2018emTests.R\u2019\\n\"     1\n## 53 \"Running \u2018group01.R\u2019 \"      1\n## 54 Running \u2018loop_genera        1\n## 55 Running \u2018LTS-special        1\n## 56 Running \u2018rsolr_unit_        1\n## 57 \"Running \u2018run-all.R\u2019\\n\"     1\n## 58 Running \u2018runTests.R\u2019        1\n## 59 \"Running \u2018sleep.R\u2019\\n  \"     1\n## 60 Running \u2018SP500-ex.R\u2019        1\n## 61 Running \u2018test_bccaq.        1\n## 62 Running \u2018test_scs.R\u2019        1\n## 63 Running \u2018test-cluste        1\n## 64 \"Running \u2018test.R\u2019\\nRun\"     1\n## 65 Running \u2018tests.R\u2019 [4        1\n## 66 Running \u2018testthat.r\u2019        1\n<\/code><\/pre>\n<p>We need to investigate more so let&#8217;s make some groups:<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"ERROR\") %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  filter(flavor_flav != \"devel\") %&gt;% \n  mutate(Output = trimws(Output)) %&gt;% \n  mutate(output_grp = case_when(\n    grepl(\"^Running \", Output) ~ \"Test\/example run\",\n    grepl(\"^Installation fail\", Output) ~ \"Install failed\",\n    grepl(\"Package[s]* requir\", Output) ~ \"Missing pacakge(s)\",\n    grepl(\"Errors in running code in vig\", Output) ~ \"Vignette issue\",\n    TRUE ~ Output\n  )) %&gt;% \n  count(output_grp, sort=TRUE)\n## # A tibble: 4 x 2\n##   output_grp             n\n##   &lt;chr&gt;              &lt;int&gt;\n## 1 Test\/example run     743\n## 2 Install failed       437\n## 3 Missing pacakge(s)   358\n## 4 Vignette issue         7\n<\/code><\/pre>\n<p>Much better. Now, let see <em>where<\/em> those are:<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"ERROR\") %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  filter(flavor_flav != \"devel\") %&gt;% \n  mutate(Output = trimws(Output)) %&gt;% \n  mutate(output_grp = case_when(\n    grepl(\"^Running \", Output) ~ \"Test\/example run\",\n    grepl(\"^Installation fail\", Output) ~ \"Install failed\",\n    grepl(\"Package[s]* requir\", Output) ~ \"Missing package(s)\",\n    grepl(\"Errors in running code in vig\", Output) ~ \"Vignette issue\",\n    TRUE ~ Output\n  )) %&gt;% \n  filter(!grepl(\"solaris\", Flavor)) %&gt;%  # I love ya Solaris, but you're not relevant anymore\n  count(output_grp, Flavor, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n))\n## # A tibble: 16 x 4\n##    output_grp         Flavor                            n     pct\n##    &lt;chr&gt;              &lt;chr&gt;                         &lt;int&gt;   &lt;dbl&gt;\n##  1 Install failed     r-oldrel-osx-x86_64             256 0.197  \n##  2 Test\/example run   r-oldrel-windows-ix86+x86_64    218 0.168  \n##  3 Missing package(s) r-oldrel-osx-x86_64             156 0.120  \n##  4 Missing package(s) r-release-osx-x86_64            133 0.102  \n##  5 Test\/example run   r-oldrel-osx-x86_64             110 0.0847 \n##  6 Test\/example run   r-release-osx-x86_64             80 0.0616 \n##  7 Install failed     r-release-windows-ix86+x86_64    73 0.0562 \n##  8 Test\/example run   r-patched-linux-x86_64           57 0.0439 \n##  9 Test\/example run   r-release-linux-x86_64           57 0.0439 \n## 10 Install failed     r-oldrel-windows-ix86+x86_64     46 0.0354 \n## 11 Test\/example run   r-release-windows-ix86+x86_64    46 0.0354 \n## 12 Install failed     r-release-osx-x86_64             36 0.0277 \n## 13 Missing package(s) r-oldrel-windows-ix86+x86_64     19 0.0146 \n## 14 Missing package(s) r-release-windows-ix86+x86_64     5 0.00385\n## 15 Vignette issue     r-release-osx-x86_64              4 0.00308\n## 16 Vignette issue     r-oldrel-osx-x86_64               3 0.00231\n<\/code><\/pre>\n<p>Let&#8217;s poke a bit more, but let&#8217;s also be aware of the fact that some (many) ERRORs on &#8220;oldrel&#8221; are due to conditions <a href=\"https:\/\/www.r-project.org\/nosvn\/R.check\/r-oldrel-osx-x86_64\/tidystats-00install.html\">like this<\/a> where the package specifies that it can only be used in release++ versions of R. So we <em>kinda<\/em> have to go all Columbo on every ERROR or exclude &#8220;oldrel&#8221; (we&#8217;ll do the latter since this post is already long) and we should also ignore the missing packages ones since that&#8217;s more than likely a CRAN issue.<\/p>\n<pre><code class=\"language-r\">filter(det, Status == \"ERROR\") %&gt;%\n  mutate(flavor_flav = case_when(\n    grepl(\"devel\", Flavor) ~ \"devel\",\n    grepl(\"oldrel\", Flavor) ~ \"oldrel\",\n    TRUE ~ \"current\"\n  )) %&gt;% \n  filter(!(flavor_flav %in% c(\"oldrel\", \"devel\"))) %&gt;% \n  filter(!grepl(\"solaris\", Flavor)) %&gt;%  \n  mutate(Output = trimws(Output)) %&gt;% \n  mutate(output_grp = case_when(\n    grepl(\"^Running \", Output) ~ \"Test\/example run\",\n    grepl(\"^Installation fail\", Output) ~ \"Install failed\",\n    grepl(\"Package[s]* requir\", Output) ~ \"Missing package(s)\",\n    grepl(\"Errors in running code in vig\", Output) ~ \"Vignette issue\",\n    TRUE ~ Output\n  )) %&gt;% \n  filter(output_grp != \"Missing package(s)\") %&gt;% \n  distinct(Package)\n## # A tibble: 254 x 1\n##    Package          \n##    &lt;chr&gt;            \n##  1 AER              \n##  2 archdata         \n##  3 atlantistools    \n##  4 BAMBI            \n##  5 biglmm           \n##  6 biglm            \n##  7 BIOMASS          \n##  8 blockingChallenge\n##  9 broom            \n## 10 clusternomics    \n## # \u2026 with 244 more rows\n<\/code><\/pre>\n<p>Now we have a target package list (+ ~26 in &#8220;FAIL&#8221;) that can very likely legitimately have issues. We&#8217;ll let more practical data scientists than I am figure out the dependency tree member count for them and then determine proper features and model selection to come up with a far more legitimate &#8220;risk metric&#8221;.<\/p>\n<h3>Just One More Thing<\/h3>\n<p>Did you read the bit about the 03-18 RDS having some serious differences from 03-19 one? Yeah, so perhaps any model needs to be run a few times or the data collected over the course of time to ensure we&#8217;re working with as clean a dataset as possible. Y&#8217;know, ask practical data science questions like:<\/p>\n<ul>\n<li>What data is available to me?<\/li>\n<li>Will it help me solve the problem?<\/li>\n<li>Is it enough?<\/li>\n<li>Is the data quality good enough?<\/li>\n<\/ul>\n<h3>FIN<\/h3>\n<p>Never contrive an analysis just to fit your preferred message.<\/p>\n<p>Assumptions <em>matter<\/em>. Analysis setup <em>matters<\/em>. Domain expertise <em>matters<\/em>. Dataset knowledge <em>matters<\/em>.<\/p>\n<p>I can sum that up as <em>mindfulness matters<\/em>, and if you approach a project that way then go forth and LIBRARY ALL THE THINGS you need to accomplish your goals.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There&#8217;s been alot of talk about &#8220;dependencies&#8221; in the R universe of late. This is not really a post about that but more of a &#8220;really, don&#8217;t do this&#8221; if you decide you want to poke the dependency bear by trying to build a deeply flawed model off of CRAN package metadata. CRAN packages undergo [&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],"tags":[],"class_list":["post-12103","post","type-post","status-publish","format-standard","hentry","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Assumptions Matter More Than Dependencies - 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\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Assumptions Matter More Than Dependencies - rud.is\" \/>\n<meta property=\"og:description\" content=\"There&#8217;s been alot of talk about &#8220;dependencies&#8221; in the R universe of late. This is not really a post about that but more of a &#8220;really, don&#8217;t do this&#8221; if you decide you want to poke the dependency bear by trying to build a deeply flawed model off of CRAN package metadata. CRAN packages undergo [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-19T05:40:25+00:00\" \/>\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=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Assumptions Matter More Than Dependencies\",\"datePublished\":\"2019-03-19T05:40:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/\"},\"wordCount\":918,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/\",\"name\":\"Assumptions Matter More Than Dependencies - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"datePublished\":\"2019-03-19T05:40:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/03\\\/19\\\/assumptions-matter-more-than-dependencies\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Assumptions Matter More Than Dependencies\"}]},{\"@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":"Assumptions Matter More Than Dependencies - 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\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/","og_locale":"en_US","og_type":"article","og_title":"Assumptions Matter More Than Dependencies - rud.is","og_description":"There&#8217;s been alot of talk about &#8220;dependencies&#8221; in the R universe of late. This is not really a post about that but more of a &#8220;really, don&#8217;t do this&#8221; if you decide you want to poke the dependency bear by trying to build a deeply flawed model off of CRAN package metadata. CRAN packages undergo [&hellip;]","og_url":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/","og_site_name":"rud.is","article_published_time":"2019-03-19T05:40:25+00:00","author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Assumptions Matter More Than Dependencies","datePublished":"2019-03-19T05:40:25+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/"},"wordCount":918,"commentCount":1,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/","url":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/","name":"Assumptions Matter More Than Dependencies - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"datePublished":"2019-03-19T05:40:25+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2019\/03\/19\/assumptions-matter-more-than-dependencies\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Assumptions Matter More Than Dependencies"}]},{"@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-39d","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":12718,"url":"https:\/\/rud.is\/b\/2020\/04\/01\/uaparserjs-updated-on-cran-using-webpack-to-make-v8-application-bundles\/","url_meta":{"origin":12103,"position":0},"title":"{uaparserjs} Updated on CRAN &#038; Using webpack to Make {V8}  Application Bundles","author":"hrbrmstr","date":"2020-04-01","format":false,"excerpt":"Just a quick note that thanks to a gentle nudge an updated version of {uaparser} --- a package that processes User Agent strings web clients send to servers --- is making its way to all the CRAN mirrors and is also available on CINC. The most significant change is a\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":11978,"url":"https:\/\/rud.is\/b\/2019\/02\/22\/cloudy-with-a-chance-of-caffeinated-query-orchestration-new-rjava-wrappers-for-aws-athena-sdk-for-java\/","url_meta":{"origin":12103,"position":1},"title":"Cloudy with a chance of Caffeinated Query Orchestration &#8211; New rJava Wrappers for AWS Athena SDK for Java","author":"hrbrmstr","date":"2019-02-22","format":false,"excerpt":"There are two fledgling rJava-based R packages that enable working with the AWS SDK for Athena: awsathena | GL| GH awsathenajars | GL| GH They're both needed to conform with the way CRAN like rJava-based packages submitted that also have large JAR dependencies. The goal is to eventually have wrappers\u2026","rel":"","context":"In &quot;Java&quot;","block_context":{"text":"Java","link":"https:\/\/rud.is\/b\/category\/java\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11648,"url":"https:\/\/rud.is\/b\/2018\/11\/14\/use-github-vulnerability-alerts-to-keep-users-of-your-r-packages-safe\/","url_meta":{"origin":12103,"position":2},"title":"Use GitHub Vulnerability Alerts to Keep Users of Your R Packages Safe","author":"hrbrmstr","date":"2018-11-14","format":false,"excerpt":"Despite their now inherent evil status, GitHub has some tools other repository aggregators do not. One such tool is the free vulnerability alert service which will scan repositories for outdated+vulnerable dependencies. Now, \"R\" is nowhere near a first-class citizen in the internet writ large, including software development tooling (e.g. the\u2026","rel":"","context":"In &quot;Cybersecurity&quot;","block_context":{"text":"Cybersecurity","link":"https:\/\/rud.is\/b\/category\/cybersecurity\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/Screen-Shot-2018-11-14-at-08.43.14.png?fit=1200%2C424&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/Screen-Shot-2018-11-14-at-08.43.14.png?fit=1200%2C424&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/Screen-Shot-2018-11-14-at-08.43.14.png?fit=1200%2C424&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/Screen-Shot-2018-11-14-at-08.43.14.png?fit=1200%2C424&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/Screen-Shot-2018-11-14-at-08.43.14.png?fit=1200%2C424&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":13498,"url":"https:\/\/rud.is\/b\/2022\/07\/10\/rust-cli-for-apples-weatherkit-rest-api\/","url_meta":{"origin":12103,"position":3},"title":"Rust CLI For Apple&#8217;s WeatherKit REST API","author":"hrbrmstr","date":"2022-07-10","format":false,"excerpt":"Apple is in the final stages of shuttering the DarkSky service\/API. They've replaced it with WeatherKit, which has both an xOS framework version as well as a REST API. To use either, you need to be a member of the Apple Developer Program (ADP) \u2014 $99.00\/USD per-year \u2014 and calls\u2026","rel":"","context":"In &quot;Apple&quot;","block_context":{"text":"Apple","link":"https:\/\/rud.is\/b\/category\/apple\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":6255,"url":"https:\/\/rud.is\/b\/2017\/09\/15\/its-a-fake-%f0%9f%93%a6-revisiting-trust-in-foss-ecosystems\/","url_meta":{"origin":12103,"position":4},"title":"It&#8217;s a FAKE (?)! Revisiting Trust In FOSS Ecosystems","author":"hrbrmstr","date":"2017-09-15","format":false,"excerpt":"I've blathered about trust before 1 2, but said blatherings were in a \"what if\" context. Unfortunately, the if has turned into a when, which begged for further blathering on a recent FOSS ecosystem cybersecurity incident. The gg_spiffy @thomasp85 linked to a post by the SK-CSIRT detailing the discovery and\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/09\/download_counts_per_day-1.png?fit=1200%2C818&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/09\/download_counts_per_day-1.png?fit=1200%2C818&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/09\/download_counts_per_day-1.png?fit=1200%2C818&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/09\/download_counts_per_day-1.png?fit=1200%2C818&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/09\/download_counts_per_day-1.png?fit=1200%2C818&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":11921,"url":"https:\/\/rud.is\/b\/2019\/02\/17\/conquering-caffeinated-amazon-athena-with-the-metis-trio-of-packages\/","url_meta":{"origin":12103,"position":5},"title":"Conquering Caffeinated Amazon Athena with the metis Trio of Packages","author":"hrbrmstr","date":"2019-02-17","format":false,"excerpt":"I must preface this post with the posit that if you're doing anything interactive() with Amazon Athena you should seriously consider just using their free ODBC drivers as it's the easiest way to wire them up to R DBI- and tidyverse-wise. I've said as much in previous posts. Drop a\u2026","rel":"","context":"In &quot;athena&quot;","block_context":{"text":"athena","link":"https:\/\/rud.is\/b\/category\/athena\/"},"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\/12103","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=12103"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12103\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=12103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=12103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=12103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}