R packages · June to October 2026

Linkmapper

A Shiny app for building genetic linkage maps and mapping QTL without writing code. It began as the final-year project of two colleagues and me at KNUST. Now it's an R package, with a hosted copy that runs in the browser.

Linkmapper's home page: the name in large type, a line about linkage mapping and QTL analysis in F2, backcross and RIL populations, buttons to upload genotypes or open a demo, and a linkage map of three groups with QTL intervals marked in amber
kinds of mapping population (F2 intercross, backcross and RIL)
3
steps from a genotype file to a report
7
functions exported for scripting
35

Building a linkage map in R usually means scripting the onemap package one step at a time. To look for QTL you then carry the map over to R/qtl. Linkmapper puts both behind a point-and-click interface. It’s meant for genetics students and instructors. It works with F2 intercrosses, backcrosses and recombinant inbred lines. There’s a hosted copy too, so you can try it without installing anything.

How it works

  1. Load a MAPMAKER or onemap genotype file. Traits can sit in the same file or come from a separate CSV.
  2. Check quality. The app counts missing data for each marker and each individual. It also runs a chi-square segregation test on every marker, with a Bonferroni correction. Filters remove the markers you don’t want.
  3. Group markers into linkage groups by LOD score and maximum recombination fraction. The app suggests a LOD threshold for your data.
  4. Order the markers in each group with RECORD, RCD, unidirectional growth or seriation, using Kosambi or Haldane distances. A heatmap of recombination fractions shows whether the order hangs together.
  5. Draw the map, which shows marker positions as you hover. Export it as an image, a table or a MapChart file.
  6. Map QTL by interval mapping or composite interval mapping. Permutations set the significance threshold. Each QTL comes with a 1.5-LOD support interval, its effect and the share of the variance it explains.
  7. Download an HTML report, an R script that repeats the analysis, or a session file to pick up later.

The demo is a simulated F2 population of 200 individuals and 66 markers. The markers fall into three linkage groups with a total length of 332.8 cM.

The marker order step: RECORD ordering with the Kosambi function on the left, three linkage groups and 66 markers placed over 332.8 cM, and a heatmap of recombination fractions for linkage group 1 with a dark band along the diagonal
Figure 1. Marker order on the F2 demo. In the heatmap, a dark band along the diagonal means neighbouring markers are tightly linked, so the order is consistent.
The linkage map step: three linkage groups with marker names and positions in centimorgans, and amber bars marking QTL intervals on groups 1 and 3
Figure 2. The finished map, with the QTL intervals from the next step drawn on it.
The QTL mapping step: Haley-Knott regression with 300 permutations, two QTL detected for Trait_1 above a LOD threshold of 3.30, the largest explaining 39.9% of the variance, and a LOD profile with peaks on linkage groups 1 and 3
Figure 3. QTL mapping on the demo trait. Two peaks clear the genome-wide threshold, one on each of linkage groups 1 and 3.

From app to package

My colleagues and I wrote the first version as our final-year project at KNUST, as a single Shiny app. In June 2026 I turned it into an R package.

Version 0.2 is a rewrite, and the three functions from version 0.1 still work as before. Each step is now its own module and its own exported function, so you can also run the analysis from a script:

library(linkmapper)
d <- read_cross("my_population.raw")
d <- filter_markers(d, max_missing = 0.25)
g <- linkage_groups(d)
m <- order_groups(g, "record")
r <- scan_qtl(build_cross(d, m), n_perm = 1000)
plot_linkage_map(m, r)

The rewrite also fixed problems in the old version. Analysis state was held in global variables, so two people using the hosted app at once could interfere with each other. The QTL step found nothing on the demo data. The map image was written into the working folder. Marker order could change from one run to the next.

To install it:

install.packages("linkmapper", repos = c("https://ebenogoe.r-universe.dev", "https://cloud.r-project.org"))
linkmapper::run_app()

What’s next

I plan to write Linkmapper up as a short software paper. Clusnalyst, the other app from the same final-year project, has been through the same rewrite into a package.

More work

2026R packages

FounderForge

A Shiny app that turns real marker data into an AlphaSimR founder population without writing R. Load a VCF, HapMap, numeric or PLINK file, check it, filter it and export what newMapPop() needs.

Tools: R · Shiny · golem · AlphaSimR · vcfR · data.table · ggplot2

2026Apps

Plotpin

An Android app for finding a plant again. I built it to walk back to bagged sorghum plants in a crossing block. Now it works for anyone who marks points in a field.

Tools: Kotlin · Jetpack Compose · Room · Paparazzi

2026Machine learning

Colony Counter

An Android app that counts bacterial colonies from plate photos, offline. Two small YOLO models do the counting, in about three quarters of a second a plate on my phone.

Tools: Python · Ultralytics YOLO26 · ONNX Runtime · Kotlin · Jetpack Compose · CVAT

2026Reverse engineering

FF Mod Studio

Tools for modding Freedom Fighters, a game from 2003. There's an editor for its textures and models, plus a Blender addon that sends edits back into the game.

Tools: C++17 · Dear ImGui · miniz · HLSL · Python · Blender

2026R packages

ggWizard

A Shiny wizard for making ggplot2 charts from a CSV or Excel file without writing code. You check and clean the data, pick one of eight chart types and style it, then export it with the R script behind it.

Tools: R · Shiny · golem · ggplot2 · plotly · readxl · DT

2026R packages

Clusnalyst

A Shiny app for cluster analysis of marker, trait and sequence data. My colleagues and I built the first version at KNUST in 2022. In 2026 I rewrote it as an R package with a live demo.

Tools: R · Shiny · golem · ape · cluster · msa · ggtree · ggiraph

2026Codebreaking

The Voynich manuscript

A book about 600 years old, written in a script nobody can read. Here's what's known about it and why no codebreaker has cracked it, with a note on my own work.

Tools: Python · NumPy · SciPy