📦 New R package: sfhotspot by Matt Ashby

Identify & analyze spatial clusters of points (places/events) entirely with sf objects.
Includes tools for counts, change over time, kernel density, Getis–Ord Gi*, & classification.

🔗 GitHub: https://github.com/mpjashby/sfhotspot

#RStats#GISchat#Geocomputation#RSpatial

📦 New R package: sfhotspot by Matt Ashby

Identify & analyze spatial clusters of points (places/events) entirely with sf objects.
Includes tools for counts, change over time, kernel density, Getis–Ord Gi*, & classification.

🔗 GitHub: https://github.com/mpjashby/sfhotspot

#RStats#GISchat#Geocomputation#RSpatial

The plotannotate package (#RStats) is now officially on CRAN:

https://cran.r-project.org/package=plotannotate

The package allows users to interactively annotate 'base R graphics' plots with freehand drawing, various symbols (points, lines, arrows, rectangles, circles, ellipses), and text. This is useful for teaching, for example to visually explain certain plot elements, and creating quick sketches.

The plotannotate package (#RStats) is now officially on CRAN:

https://cran.r-project.org/package=plotannotate

The package allows users to interactively annotate 'base R graphics' plots with freehand drawing, various symbols (points, lines, arrows, rectangles, circles, ellipses), and text. This is useful for teaching, for example to visually explain certain plot elements, and creating quick sketches.

4/5 As an extreme example, you can plot the analemmas for noon and see that it's below the horizon for part of the year in the arctics: this is when those latitudes are in the long polar night! (the crazy looping around latitude = 0 is just from a singularity due to the spherical-to-rect projection)

figure 8 rising and falling below horizon
figure 8 rising and falling below horizon

5/5 Focusing back on a single lat/long, here we simulate the analemma across the day in DC (here, in 30 minute increments) to see how the shape changes position across the sky/year. Basically, visualizing a 2D projected slice of 4D time/space: that's a fun #dataviz!

#RStats #rayverse

1/5 Modeling the atmosphere at noon in Washington, DC for a full year in #RStats with the #rayverse and my upcoming sky modeling package. If you follow the path of the sun, you might notice that it travels in a lopsided figure eight curve. Why? What's going on here?

sky simulation animation showing figure 8 pattern
sky simulation animation showing figure 8 pattern

Weekend project: New actionsMonitoR #RStats 📦 gets all the GitHub workflows in your GitHub account (authorized by PAT) and can display them in a searchable table
https://github.com/smach/actionsMonitoR

Written almost 💯by Google Gemini 2.5 Pro - I wanted to test out Gemini on writing R code. It did quite well except for writing tests, when it went a bit off the rails.
#GenAI
[There's also a repo name column not in image]

screenshot of a workflow status table displaying various automation tasks. The table includes four columns: workflow_name, Trigger, Last Status, and Last Run (UTC).

pages-build-deployment | dynamic | success | 2025-08-16 00:00

Generate InfoWorld RSS Feed | push | success | 2025-08-16 00:00

Update NFL Game Data | schedule | success | 2025-08-15 00:00

Run R Script and Store Results | schedule | success | 2025-08-15 00:00

pages-build-deployment | dynamic | success | 2025-07-20 00:00

Copilot | dynamic | success | 2025-07-14 00:00

Keep Streamlit Alive | schedule | cancelled | 2025-05-21 00:00

pages-build-deployment | dynamic | success | 2024-09-17 00:00

Dependabot Updates | dynamic | failure | 2024-08-31 00:00

pages-build-deployment | dynamic | success | 2024-08-16 00:00

pages-build-deployment | dynamic | success | 2024-08-10 00:00

pkgdown.yaml | push | success | 2024-08-10 00:00

run_scraper | — | never run | —
Alt text by ChatGPT
screenshot of a workflow status table displaying various automation tasks. The table includes four columns: workflow_name, Trigger, Last Status, and Last Run (UTC). pages-build-deployment | dynamic | success | 2025-08-16 00:00 Generate InfoWorld RSS Feed | push | success | 2025-08-16 00:00 Update NFL Game Data | schedule | success | 2025-08-15 00:00 Run R Script and Store Results | schedule | success | 2025-08-15 00:00 pages-build-deployment | dynamic | success | 2025-07-20 00:00 Copilot | dynamic | success | 2025-07-14 00:00 Keep Streamlit Alive | schedule | cancelled | 2025-05-21 00:00 pages-build-deployment | dynamic | success | 2024-09-17 00:00 Dependabot Updates | dynamic | failure | 2024-08-31 00:00 pages-build-deployment | dynamic | success | 2024-08-16 00:00 pages-build-deployment | dynamic | success | 2024-08-10 00:00 pkgdown.yaml | push | success | 2024-08-10 00:00 run_scraper | — | never run | — Alt text by ChatGPT

In another case in "every #AI example has the seeds of its own destruction", this #RStats package uses an #LLM to explain errors. The AI-generated hex sticker is not actually hexagonal and the explanation of the error in the readme is flat-out wrong and totally useless.

https://github.com/rdboyes/errbud

Screenshot of the readme. 

# This is a basic example which shows you how to solve a common problem:

sum[1]

Error in sum[1] object of type builtin is not subsettable. 

Call ai() to help explain what’s going on:

errbud::ai()

Output (this example from local gpt-oss:20B)

The error “object of type ‘builtin’ is not subsettable” usually means you called the subsetting operator [ ] without attaching it to a real object (e.g., x[1] vs. just [ or mis‑spelled a function name). R’s [ is an S3 generic that works on vector, matrix, data frame, list, etc., and it expects an object on its left‑hand side. In your session you only have the default packages loaded and three objects (chat, pkgs, x). The fix is simply to provide a concrete object inside the brackets. For example, if you want the first element of x, type x[1]; if you want the element of pkgs whose name is stored in chat, type pkgs[chat] (or pkgs[[chat]] if you need a single element from a list). If you intended to use a different function (say subset from base R or filter from dplyr), call that function directly: subset(x, condition) or dplyr::filter(df, condition). Once [ is attached to an actual object, the “builtin not subsettable” error disappears.
Screenshot of the readme. # This is a basic example which shows you how to solve a common problem: sum[1] Error in sum[1] object of type builtin is not subsettable. Call ai() to help explain what’s going on: errbud::ai() Output (this example from local gpt-oss:20B) The error “object of type ‘builtin’ is not subsettable” usually means you called the subsetting operator [ ] without attaching it to a real object (e.g., x[1] vs. just [ or mis‑spelled a function name). R’s [ is an S3 generic that works on vector, matrix, data frame, list, etc., and it expects an object on its left‑hand side. In your session you only have the default packages loaded and three objects (chat, pkgs, x). The fix is simply to provide a concrete object inside the brackets. For example, if you want the first element of x, type x[1]; if you want the element of pkgs whose name is stored in chat, type pkgs[chat] (or pkgs[[chat]] if you need a single element from a list). If you intended to use a different function (say subset from base R or filter from dplyr), call that function directly: subset(x, condition) or dplyr::filter(df, condition). Once [ is attached to an actual object, the “builtin not subsettable” error disappears.

The {huxtable} #RStats 📦 is for “creating text tables. It is powerful, but easy to use. Huxtable’s features include:
* Export to LaTeX, HTML, Microsoft Word, Microsoft Excel, Microsoft Powerpoint, RTF and Markdown
* Easy integration with knitr and rmarkdown documents”
By David Hugh-Jones. On CRAN.
https://hughjonesd.github.io/huxtable/huxtable-html.html

Here I tend to read a lot of negative comments about #LLMs, but does anyone share my experience? I use them as an aid to mostly write #rstats and #LaTeX #tikz code faster or recently to clean up a very messy #emacs configuration file. They may hallucinate and I always need to double check the output, but I find #LLMs extremely useful. The ecological footprint is a discussion for another day.

My early impressions of the ChatGPT Web UI with GPT-5 are pretty negative for an #RStats project I’m working on. Code that doesn’t work, not understanding context & follow-up questions. Am guessing I was routed to the less capable mini or nano models at times.
I still like Claude Opus 4.1, but I bump up against Web limits quickly. Google Gemini 2.5 Pro is promising with a lot of context and instructions. Its context window is 5X larger than Opus.
#GenAI#LLMs