getPresidingOfficers() returns the Speakers of the House, Presidents
of the Senate, their deputies, Chairs of Committees, temporary chairs,
members of the Speaker's panel and acting holders of these offices since
1901, with each person's PHID and the dates they held the office (#6).
It comes from the Handbook's records of parliamentary positions in one
request, with a stored copy for update = FALSE or when the Handbook
cannot be reached. Chamber is taken from the chamber the person sat in
when the term began, since "Chairman of Committees" and "Temporary Chairman
of Committees" were offices in both chambers. Rows with a problem in the
Handbook are flagged: one term with no start date, one ending before it
starts (Turley, 1909) and three starting when the person was not in
parliament (Cunningham, Eggins, Keane).CITATION.cff holds the
citation metadata, and citation("ausPH") gives the reference in R.getPresidingOfficers().chamber_did_not_sit, and
apply_errata = TRUE wrongly set SenateSitting to FALSE. If you used
getSittingDates(apply_errata = TRUE), re-run it (#4).continuation_of_previous_sitting. The Senate did sit that day (#5).getErrata() now covers 13 errors.getSittingDates() already did, through a new update argument:
getParlService() retrieves the whole table from the Handbook's records
of service in a single request (previously 1,881 requests). This source is
also more accurate: the per-person timelines used before list two
senators appointed in August 2026 as House members with no electorate.getElections() adds elections the Handbook has listed since the stored
copy. Their FullSenateElection is NA, as the Handbook's list does not
say whether an election was a double dissolution.get2CP() adds 2CP results for those elections.getPartyService(update = TRUE) re-fetches the records of everyone who
has joined or served in parliament since the stored copy. The Handbook
has no bulk source for party service (its records of service leave most
party dates blank), so this takes about 250 requests and is off by
default.update defaults to TRUE except for getPartyService(). With
update = FALSE, or when the Handbook cannot be reached, the stored copy
is returned (with a message in the second case). The date of any update is
in a new updated attribute.data-raw/ now use them.getParlService(): placeholder_end_date now flags only terms that are
not the member's latest. The Handbook's records of service use 1900-01-01
for every term that has not ended, which is returned as NA as before.getOccupations(), getQualifications() and getSchools() now return
tibbles, like every other function.get2CP() and getElections() now record the date their stored copy was
taken from the Handbook in the scraped attribute, like
getParlService(), getPartyService() and getSittingDates().data-raw/data_map.tex), and out-of-date statements
are corrected.getParliaments() now returns ParliamentNext, the PID of the
following parliament.First major release. All stored data refreshed from the Parliamentary Handbook on 26 October 2026. This release follows a review of every issue raised by linking ausPH to Hansard speech data: each was traced to the package, its stored data, the Handbook or Hansard, and the package's share fixed here.
get2CP(): Party now holds the Handbook's full party name (e.g.
"Australian Labor Party" rather than "Labor") and a new pID column links
it to getParties() where the name matches exactly (83% of rows).
Hand-filled rows in missing_2cp.csv keep their original party labels.getElections() reads a new elections.csv in place of ElectionDates.xlsx
and gains HandbookId (the Handbook's own election id) and
handbook_flag. Id is unchanged, so joins on ElectionID still work.getMinistries() gains pID, and ministries with no listed party are
kept with Party = NA (previously they were dropped).getParlService(), getPartyService() and getSittingDates() gain a
handbook_flag column; getSittingDates() returns Date as a Date
and drops the internal year_id column.getSchools(), getOccupations() and getQualifications() no longer
return rows with empty values.NULL with a message, instead of an error, when the
Handbook API cannot be reached.getErrata() returns a table of known errors in the Handbook, with the
corrected value, the evidence and a source. It covers 14 errors so far:
overlapping service terms (Calwell, Gietzelt, Rosevear, Fry, Fairbairn),
sittings recorded for chambers that did not sit (Senate 14 March 1928 and
17 March 1997, House 5 February 2008), and six by-election dates that
contradict the Handbook's own tenure records (Tasmania 1902, Kooyong 1910,
Kalgoorlie 1940, Fremantle 1945, and East Sydney and Grey 1963, which
the Handbook has swapped).handbook_flag. getParlService(), getPartyService(),
getSittingDates() and getElections() take apply_errata = TRUE to
substitute the corrected values. An erratum only applies while the Handbook
still has the wrong value, so it stops applying once the Handbook is fixed.overlapping_term and placeholder_end_date
(getParlService()), same_day_party_record (getPartyService()) and
not_in_handbook (getElections()).getMinisters() and getShadowMinisters(): MDateStart and MDateEnd
were NA for every row after the Handbook changed its date format. Dates
are now parsed whatever format the Handbook uses.getMinistries() dropped the first Barton Ministry (the Handbook lists no
party for it), so joins from getMinisters() on MID found no ministry.get2CP(): 42 division-years had 4 or 8 rows instead of 2. The original
scrape also picked up by-election results for the same division and
parliament, and the Handbook's percentages for those rows were computed
across all of them (e.g. Lindsay 1996 showed 26% rather than 52%).
Results now come from one clean pair per division, with margin and
percentage computed from the votes.NA
(affected open-ended committee memberships and some service records).getParties() trims the trailing whitespace the Handbook adds to 27 party
abbreviations (e.g. "NP "), which broke exact matching.getParlService() errored if chamber was not supplied; it now defaults
to "all".getSittingDates() and getPartyService() returned their result
invisibly; getCommitteeMembers() joined without a key.print() status output replaced with message().data-raw/, re-runnable from the
package root, and stop rather than save a partial scrape. Stored tables
record their scrape date in the scraped attribute.getSittingDates() and getSchools() added.