This release expands nprcgenekeepr beyond pedigree management and
genetic value analysis. It adds interactive pedigree diagrams,
marker-based genetic analysis, MHC haplotype reporting, cross-center
identity matching, ancestry-aware breeding safeguards, de-identified
export workflows, and longitudinal monitoring of colony genetic health.
Major
affected column shades affected individuals. Unaffected
and unknown-status individuals, and everyone when the column is
absent, are drawn open.name column shows names beside ids, with a Show Names
on Diagram toggle. De-identified exports remove names. Twin
connectors (identical, fraternal or unknown zygosity) follow
kinship2's twin codes.Minor
makePedigreeMatingLayout() has no orderBySex argument and accepts
an optional kinshipMatrix, an already-computed kinship table to
reuse when flagging consanguineous matings.example_pedigree_*.csv in
extdata/examples) show classic mating structures: brother-sister,
linebreeding, a daughter bred to her sire, first cousins, and
half-siblings sharing a sire. Each has 11-14 animals and one
consanguineous mating; the Pedigree Diagram article walks through
them.Major
kinship(), reportGV(), gvaConvergence(),
createSimKinships() and cumulateSimKinships() take
twinRelations. readTwinRelations(), checkTwinRelations() and
obfuscateTwinRelations() read, validate and de-identify the file
(columns id1, id2, code).shrinkPedigree() trims a large pedigree to the animals needed to
stay informative within a genotyping budget, optionally keeping
affected animals. Results repeat from run to run, unlike kinship2's
equivalent, which breaks ties randomly. Script only.Minor
kinship() computes X-chromosome relatedness with chrtype = "x"
(needs sex); the default is unchanged. Script only.Major
obfuscateGenomicROH() (issue #152). Loci that are in the locus file
but not in the genotype file are named in a notice above the table
(and in a warning from computeGenomicROH()), because F_ROH is
calculated without them.markerObservedHeterozygosity() and
markerExpectedHeterozygosity(); markerParentageExclusion(), which
flags a parent when more than maxExclusions loci (default 2)
conflict; markerFst(), Hudson's Fst per locus and pooled; and
markerParentageLikelihood().Minor
checkMarkerGenotypeFile() checks a genotype file with one row per
animal and locus (id, locus, allele1, allele2) and rejects a
locus with more than two alleles; buildMarkerGenotypeMatrix() turns
it into the animal-by-locus table the marker functions use. A blank
allele counts as not typed: a record with one or both alleles blank is
treated like a missing record, and a locus nobody is typed at shows
NA for expected heterozygosity and stays out of the mean.fromCenter column, which it needs to find any
candidate. It uses the same words as the Potential Parents tab.checkLocusMetadata() reports each locus's chromosome and position
data as complete, partial or missing; a chromosome name left blank
counts as missing. checkLinkageMarkerGenotypeFile() accepts panels
with more than two alleles per locus, such as microsatellites.markerRealizedRelatednessVariance() estimates how far DNA-based
relatedness can vary around the pedigree prediction. markerLdBlock()
and obfuscateLdBlocks() report and de-identify linked marker blocks
(issue #153).checkSequenceGenotypeFile(), computeGenomicROH() (inbreeding from
runs of homozygosity) and obfuscateGenotypeMatrix() support
sequence-scale genotype files, and markerKinship() and
markerParentageLikelihood() are optimized for large panels (issue
#152).Major
mhcHaplotypeFrequency() gives copies, carriers and frequency per
haplotype, and discloses missing and provisional calls. A haplotype is
rare at frequency 0.01 or lower, or with 2 or fewer carriers; both
thresholds are adjustable.mhcHaplotypeCarriers() lists the animals carrying each rare (or
every) haplotype, including provisional carriers.Minor
checkMhcHaplotypeFile() validates a file with two named haplotypes
per animal (a trailing ? marks a provisional call);
obfuscateMhcHaplotypes() replaces carrier-list ids with the
pedigree's de-identification aliases and stops on an id it never
covered.Major
resolveCrossCenterIds() merges records for the same animals using a
curator-confirmed id-matching table, preserving each animal's own data
columns, including a column only one of the two centers recorded.Minor
checkCrossCenterMapping() reports every problem in an id-matching
table at once, including a second-center animal that uses an id the
table already gives to a different first-center animal (the merged
file would hold that id twice).Major
setPopulation() still flags every
animal when given no IDs.reportGV() takes guCutoff, zScoreCutoff and
axisPriority.Minor
calcSkewness(), calcKurtosis()).Major
groupAddAssign()
returns a candidates field and takes maxCandidates (issue #146).harem = TRUE and a non-zero sexRatio to
groupAddAssign() now stops with a message naming both settings,
instead of returning groups of one or two animals; use one or the
other. The Breeding Groups tab was never affected, since its radio
takes Harem or Custom, not both.groupAddAssign() and fillGroupMembersWithSexRatio() follow
the same rule. On a pedigree with such males, results for a given
random seed differ from earlier versions.Minor
exhaustive, maxExhaustiveCandidates and exhaustiveTimeLimit
(issue #146).readAncestryRules(), checkAncestryRules(), the
ancestryRules argument of groupAddAssign(), and
reportAncestryViolations() for existing groups. An example rules
file and pedigree ship with the package.Major
reportMatePairs() takes ancestryRules and
overriddenRules. Without rules or an ancestry column, nothing
changes.Minor
reportMatePairs() reports mate-pair candidates with relatedness and
genetic-value context. Report only (issue #151).reportMatePairs() leaves them out of both tables.Major
Minor
obfuscatePed() gained linkedDateShift (default TRUE): all of
one animal's dates move by the same offset, so the gaps between them
stay realistic (issue #150).Major
readSnapshotHistory(), checkSnapshotHistory() and
appendColonySnapshot(); an example history ships.Minor
createColonySnapshot() records a finished analysis's results,
population make-up and settings in one dated row, and refuses a
snapshot whose stated animal-membership rule (whole pedigree or focal
population) does not match the animals analyzed.plotSnapshotTrends() draws each value over time, with uncertainty
for values from repeated random sampling, and calcSnapshotDeltas()
lists changes between two dates; both flag differing settings or
software versions.Major
Fixed: loading an ancestry rules table that is valid but has no rules made Download Audit Manifest fail with an error on both the Mate Pair and Breeding Groups tabs. A table with no rules now counts as no rules in effect: the download works, and its single row says that no ancestry rules were in effect for the run.
Fixed: a breeding group with no breeding-age females was shown as a green Production cell in the Genetic Diversity dashboard, as healthy as a group that meets its birth target. Production cannot be calculated for such a group, so its cell is now gray. An undefined Inbreeding cell is red, so missing data there stands out.
Fixed: forming breeding groups that include animals with no birth date, after running the genetic value analysis, could turn the page gray and end the session (the shipped example pedigree does this with the default settings). A male with no birth date is now left out of the Inbreeding count of potential mates, a female with no birth date is counted as described in the next entry, and a problem while the Genetic Diversity heat map is being worked out no longer ends the session.
Fixed: in the Genetic Diversity dashboard, a female with no birth date was always counted as a breeding-age female in the Production cell, whether or not she had any offspring, which lowered Production. In both the Production and the Inbreeding cells she now counts only when the pedigree lists an offspring for her, wherever that offspring is; a female with no birth date and no offspring is left out of both. A group whose only female is left out has no Production value, so its cell is gray. A note under the heat map now says how many animals in the groups have no birth date, and how many of those females were counted or left out.
Fixed: the column names above the Genetic Diversity heat map were slanted and cut off by the top edge of the picture (they read "Va", "Or", "Pro" and "Inb"), and both the column names and the group names were too small to read comfortably. The names are now written level, in bold and whole, at 2.5 times the old size.
New: the Input tab now warns when animals in the uploaded pedigree
have no birth date. The app shows its yellow warning notice and opens
the Warnings tab, which says how many animals have none (1,432 of
3,694 in the shipped example pedigree) and that their age is unknown,
so age-based checks and counts, such as the parent-age check, the
Age-Sex Pyramid and the breeding-age counts, cannot use them. It is
only a warning: the pedigree can still be used.
runQcStudbook(reportChanges = TRUE) returns the same warning.
New: the Input tab now warns when an animal's death or departure date
is earlier than its birth date. The Warnings tab says how many animals
and names the first five; their age comes out zero or negative, so the
dates need a look in the file. A death or departure on the birth day
is not flagged, and the pedigree can still be used.
runQcStudbook(reportChanges = TRUE) returns the same warning.
Fixed: a pedigree file with an invalid date stopped the Input tab with a message that gave no row number, such as "do not know how to convert ... to class Date", whenever the file had more than one date column (birth and exit dates, as the shipped example pedigree has) or the first date in a column was the invalid one. The Input tab now lists every invalid date by row, in every date column, so the rows can be found and corrected in the file.
Fixed: a pedigree file whose fromCenter column held text that is not
a yes or a no was read with no message at all: any value containing a
y or t was taken as TRUE and any containing an n or f as
FALSE, so "unknown", "N/A" and "none" became FALSE and "maybe" became
TRUE, which changes which animals the Potential Parents and Candidate
Parent Assignment tabs treat as born in the colony. Only a whole y,
yes, t or true (TRUE), or n, no, f or false (FALSE), is
read now, in any case and with spaces around it; any other value stops
the load and names its rows, so a file that holds "unknown" in this
column stops until it is corrected. convertFromCenter() and
qcStudbook() behave the same way.
Fixed: when a pedigree file's geographic origin column was headed in
all lowercase (geographicorigin), the column was renamed to
geographicOrigin with no notice at all, so runQcStudbook()
reported no changed columns. It is now counted as a column change like
every other rename, so runQcStudbook() reports it and
qcStudbook(reportErrors = TRUE) keeps the record. The Changed
Columns tab does not list this rename.
Fixed: checkRequiredCols() stopped with the message "missing value
where TRUE/FALSE needed" when it was given five or more column names,
one of them missing (NA), and a required column was absent. It now
treats the missing name like any other name that does not match, so it
returns the absent required columns, or, with reportErrors = FALSE,
stops naming them. The Input tab is not affected: a blank header in a
pedigree file is read as X, and the tab still reports the missing
column.
Fixed: on the Age-Sex Pyramid tab, Download Plot with no pedigree loaded saved a picture of the packaged example pedigree, with nothing on it to say so, so it could pass for the colony's own data. It now saves nothing until a pedigree is loaded: the download fails. Once a pedigree is loaded the button works as before.
Fixed: after focal animals were chosen on the Pedigree Browser, the Genetic Diversity tab showed "kmat is missing kinship for group member(s)" instead of the heat map whenever a breeding group (from the "All available" source, for one) held a living animal that was not one of the focal animals. The tab now scores every group, using the kinship of the whole pedigree, as Summary Statistics and Breeding Groups do. An animal with no row in the genetic value report is left out of the Value column's share of low-value animals, as an "Undetermined" one is, so a group made only of such animals has no assessed value and its Value cell is red.
Fixed: on the Genetic Diversity tab, forming breeding groups and then reading a different pedigree, or trimming the pedigree on the Pedigree Browser, left the same red error ("ped has no rows for group member(s): ...") on the page twice in place of the heat map. The tab now says once, in a sentence, that some animals in the breeding groups are not in the pedigree now loaded and asks you to form the groups again. Any other error from the heat map's calculation is shown once, where the heat map would be.
Fixed: the three count boxes on the Input tab's QC Summary (Records Processed, Errors and Warnings) were plain gray whatever the check found. They are now colored: Errors is red when there is at least one error, Warnings is orange when there is at least one warning, both are green when the count is 0, and Records Processed is dark blue.
Fixed: a real animal whose id starts with a capital U (such as U1,
U123 or Uma) was mistaken for a stand-in for an unknown parent, so
it was left out of founder and breeder counts, hidden when "Display
Unknown IDs" was off, and its offspring were shown with an unknown
parent. Only ids shaped like a stand-in -- a U followed by at least
four capital letters or digits, such as U0001 -- are treated that
way.
New placeholder column: the pedigree check records which animals are
stand-ins. Enter FALSE for a real animal whose id looks like one
(such as U1234) and it is kept as real throughout, including
Potential Parents, founder counts and the breeder counts behind
effective population size.
A placeholder value other than TRUE, FALSE, 1, 0 or blank stops the
check and names the rows. The column survives download and re-upload,
de-identified export and cross-center linking.
Changed: Potential Parents (getPotentialParents()) lists candidates
only for the missing parent: an animal with a recorded dam and no sire
gets candidate sires, and the reverse. Before, a recorded dam was
ruled out of her own animal's list, so those dam lists were never
useful.
New: each Potential Parents result (getPotentialParents()) now says
where its dam list came from: damBasis is "provenBreeder" for
females who gave birth near the animal's birth, "eligibleFemale"
when there were none and every female old enough and present is listed
instead, and blank when no dam is listed. The sire and dam lists
themselves are unchanged.
Fixed: a sire or dam whose sex was blank, misspelled or space-padded
(such as "M ") was reported as a "female sire" or "male dam" and
stopped the upload. Spaces are ignored, and a blank or unreadable sex
is read as unknown.
Fixed: the Shiny app read an empty cell in an uploaded CSV or text
file as a value rather than missing, unlike Excel uploads and
getPedigree(). Empty cells are now read as missing.
The old behavior meant files with blank founder sire and dam cells would not load, a blank ancestry counted as OTHER instead of UNKNOWN, and a founder with a blank origin ranked as an import instead of "Undetermined".
New: with "Pedigree(s) and genotypes in one file", the Input tab now
reads genotypes from columns named allele_1 and allele_2 or
first_name and second_name as well as first and second,
accepts text labels such as A, B, C as well as whole numbers, and
shows a line under the QC Summary saying which columns it read or why
it read none. A file with text in first and second, whose
genotypes were not used before, now uses them, so its Genetic Value
results can change.
Fixed: with "Pedigree(s) and genotypes in separate files", a genotype file the app could not use was left out without a word: the QC Summary showed the same green "Data passed quality control" as for a good file, and a file with a short row grayed out the page and ended the session. The QC Summary now says "The genotype file was not used, so no genotypes are used." and gives the reason, and the app keeps running.
Fixed: Founder genome equivalents, their standard error and gene diversity are worked out from the pedigree alone, so genotypes no longer make them NA.
Minor
readKinshipOverrides().deidentified_jmac_ped.csv
could not be loaded in the app. It is now rebuilt from a 2018 studbook
(2,590 animals, de-identified, 819 with a recorded sire) and loads
once Minimum Dam Age is set to 3.3 or lower and Minimum Sire Age to
4.3 or lower, because Japanese macaque mothers and fathers must by
default be at least 4 and 5 years old at a birth.isReady), which
only a script or app that uses the module itself reads, stopped with
an error instead of saying FALSE when the uploaded genotype file could
not be used (wrong columns, a row too short to read, an empty file).
The Marker Genetics tab looks the same: it still shows the error for
such a file.removeUnknownAnimals(), convertDate(), removeDuplicates()
and correctParentSex() mishandled an animal whose record of being
added was blank, missing or unrecognized: they could drop, skip or
mislabel it, return an empty pedigree, or stop with an unexplained
error. They now treat only animals recorded as added as stand-ins. The
"Duplicate IDs found" list no longer names stand-ins that were not
duplicated.getAncestors(), findLoops() and countLoops() stop with a message
naming the animals instead of an "infinite recursion" error.getAncestors(), findLoops() and countLoops() no longer
stop with "argument is of length zero" when a pedigree lists a parent
that has no row of its own. Such a parent is treated as an animal with
unknown parents, the same way the pedigree check treats it. Asking
getAncestors() about an animal that is not in the pedigree tree at
all stops with a message naming it.getLkDirectAncestors() no longer runs without end when a
pedigree lists an animal as its own ancestor; it stops and returns the
animals found. getPedDirectRelatives() no longer runs without end
when a pedigree has a row with no animal id; it stops and returns the
family, that row included.convertRelationships() given the id of a single animal now
returns that animal's own "Self" row instead of a meaningless row, and
given ids that match no animal returns an empty table instead of an
error. makeRelationClassesTable() returns an empty table when there
are no pairs of different animals to count instead of stopping.
filterKinMatrix() always returns a matrix, so reportMatePairs()
given one animal's id returns its usual empty result instead of an
error.U0001, U0002, ...) could duplicate an id a
real animal already had. The check and addUIds() skip any id already
in the pedigree, including one that appears only as a sire or dam.reportGV() now stops before doing any calculation, with a
message naming every missing column, when the pedigree lacks id,
sire, dam, gen or sex. A missing id, sire, dam or gen
used to give an unexplained R error.reportGV() and gvaConvergence() now stop before doing any
calculation, with a message giving the number of animals, when the
population of interest has fewer than 2 animals (none, or one). They
used to stop with an unexplained R error. Ranking needs at least two
animals to compare.calcGU(), calcGUSE(), calcA() and kinship() now work
for a single animal, and calcFE(), calcFG(), calcFEFG() and
calcFGSE() for a population with one living descendant, instead of
stopping with an unexplained R error. calcGU(), calcGUSE() and
alleleFreq() return an empty table when given no animals or no
alleles.character(0) above its one sentence. The pop-ups now show only the
sentence.paste-your-labkey-api-key-here, which took the place of its .netrc
file, so the sign-in failed. A line that starts with # is now a
comment wherever the configuration file is read, so that site uses its
.netrc file, or is told that no credential was found. A
commented-out center above the real one no longer wins, and a
comment after the last setting is no longer read as part of its value.Center for center, stopped the program with
"subscript out of bounds". It is now read."/My Folder/EHR" was read
as two values. A value in double quotes is now one value. A # that
starts a word begins a comment that runs to the end of the line, also
after a setting, so a note written after a setting is no longer read
as part of its value. A list of column names inside one pair of quotes
is one name: write each name on its own, in quotes if you like.= took the name of the next
setting as its value, so apiKey = above center = "SNPRC" gave the
API key center. Such a setting is now empty, and an empty API key is
no key.http://deepthought:8080/labkey falls apart unless it is in quotes;
neither was true. The notes now describe how the file is read.
data("exampleNprcgenekeeprConfig") is now the shipped example file,
not an older copy of it.get_elapsed_time_str() reported 59.6 seconds
as "60 seconds." and 119.6 seconds as "1 minutes and 60 seconds."; it
now rounds first and says "1 minutes and 0 seconds." and "2 minutes
and 0 seconds.".create_wkbk() returned TRUE for a workbook in a folder
that does not exist and wrote nothing; it now stops and names the
folder. saveDataframesAsFiles() and makeExamplePedigreeFile()
stopped with "the condition has length > 1" for a file type that was
not one of "txt", "csv" or "excel"; they now say which three are
allowed. makeExamplePedigreeFile() named its default file
examplePedigree.csv for every type; it is now examplePedigree.csv,
examplePedigree.txt or examplePedigree.xlsx.
withinIntegerRange() gave the minimum for a number too large for an
integer, such as 3,000,000,000, and now gives the maximum.obfuscateDate() ran for ever when its
earliest allowed date could not be reached and stopped with an unclear
message when that date was missing; it now stops with a message that
gives the position of the date, and a missing earliest date means no
limit. obfuscateId() and obfuscatePed() stopped with "missing
value where TRUE/FALSE needed" for a missing id; they now say that the
id must not contain NA and give its position.setExit() ignored a death or departure column written with
capitals, such as Death, and either added no exit column or stopped
with "replacement has 0 rows"; it now finds the column in any letter
case. makeGeneticDiversityHeatmap() drew two groups with the same
label on one row; it now stops and names the label.
dataframe2string() ended the text for an empty data frame with a
backslash and an n. The help of focalAnimals now says that its id
column is a factor.qcStudbook() and geneDrop() now reject id,
sire, or dam values containing a period (offenders returned in
errorLst$invalidIdChars); auto-generated IDs remain period-free.getLogo(),
shouldShowErrorTab(), modMinimalTestUI(), and
modMinimalTestServer(). The Shiny application was rewritten
internally as a modular architecture; runGeneKeepR() remains the
primary entry point (runModularApp() works as a deprecated alias).
(#27, #110)getPotentialParents()); dam selection uses a gestation-derived
exclusion window rather than a fixed +/- 182.5-day window. (#48,
#31)speciesGestation table covers 14 common colony NHP
species (previously only rhesus macaque), with numeric rather than
integer breeding ages so fractional minima are represented exactly.
getPotentialParents() and the Potential Parents tab derive each
animal's gestation window from its species via the new
getSpeciesGestation(); the Genetic Value Analysis missing-parent
correction uses per-species minimum breeding ages; and an optional
configuration-file entry (speciesOverridesPath, plus
minBreedingAgeDefault and gestationDefault) overrides these
values via the new loadSpeciesOverrides(). Species absent from the
table keep the previous defaults (a 210-day gestation and a 2-year
minimum breeding age), so existing results are unchanged. Completes
issue #73. (#73)qcStudbook(),
checkParentAge(), runQcStudbook(), and getPotentialParents()
now accept minSireAge and minDamAge in place of a single
minParentAge (kept as a deprecated alias that sets both). The
Shiny app's single "Minimum Parent Age" field is replaced by
separate "Minimum Sire Age" and "Minimum Dam Age" fields. (#119)getDescendantPedigree(). (#35)isFounder() and
getFounders().getAutoIdFormat() and setAutoIdFormat(),
making the auto-generated placeholder-ID format configurable
(default "U%04d"). (#44, #38)reportGV() and
geneDrop() now also default to 1000, down from 5000), and an inert
"Minimum breeding age" slider was removed.getBoxWhiskerDescription()), plot export to PNG, PDF, and SVG
(savePlotToFile()), and an enhanced age-sex pyramid
(getPyramidPlot()).GD = 1 - 1 / (2 * FG)) and -- over the current living breeders --
a sex-ratio effective population size
(4 * Nm * Nf / (Nm + Nf)) and a variance effective population
size (the Crow & Kimura (1970) form), via the new exported
calcGeneDiversity(), calcNeSexRatio(), and calcNeVariance();
each is defined, with its idealizing assumptions, in the in-app
Population Genetics Terms panel. (#118)guSE column (the gene-drop
Monte Carlo standard error, via the new calcGUSE()) and a "Genome
Uniqueness SE (max)" summary row. The new gvaConvergence() gives
evidence-based advice on how many gene-drop iterations a pedigree
needs for a stable ranking, by comparing rankings from split halves
of one gene drop; it also accepts a kinshipOverrides argument.parentage column labels each animal "known", "one unknown
parent", or "both unknown"; animals with both parents unknown and no
recorded origin ("Undetermined") are now ranked last, with genome
uniqueness reported as 0 rather than the inflated gene-drop-founder
artifact value. Animals recorded as genuine imports (an origin)
are unaffected. (Changes reported rankings and genome-uniqueness
numbers for affected animals.)reportGV() and the Genetic Value Analysis tab now accept an
optional kinshipOverrides argument (or file upload) of
outside-information kinship coefficients (id1, id2, kinship)
that replace the pedigree-derived kinship for the named pairs before
ranking; applies across the Genetic Value Analysis, breeding-group
formation, and summary-statistics tabs, and the summary-statistics
relationship table gains an overridden flag column. New exported
applyKinshipOverrides(), checkKinshipOverrides(), and
readKinshipOverrides(); gvaConvergence() also accepts overrides.
The unknown-parent mean-kinship correction is kept even when an
override is supplied. Leaving no override reproduces previous
results exactly. (#13, #95)getLkDirectRelatives() now returns the full connected pedigree
component (ancestors, descendants, and collaterals such as siblings
and mates) instead of only the strict ancestor/descendant lineage;
the new file-sourced getFileDirectRelatives() provides the same
for file pedigrees. The new getFocalAnimalPedFromFile() and
setLabKeyDefaults() let the focal-animal workflow run fully
offline from files, and the Shiny input module offers an optional
pedigree-file input alongside the LabKey/EHR path.loadSiteConfig(). (#50)geneDrop() now reports duplicate animal IDs with a clear error
instead of the base-R duplicate 'row.names' are not allowed
message.addGenotype() now coerces its allele columns to character, so the
integer allele encoding is consistent whether they are supplied as
character or factor.rhesusPedigree and rhesusGenotypes data
sets with canonical column types (character id, sire, and dam
and Date birth and exit in rhesusPedigree; all-character
columns in rhesusGenotypes), preserving every value.summarizeKinshipValues() now reports the secondQuartile column
as the lower hinge (fivenum()[2]) instead of duplicating min.bslib, DT, and ggplot2 (Imports);
shinytest2 (Suggests).create_wkbk() now writes .xlsx files with openxlsx instead of
WriteXLS, removing the package's Perl requirement (WriteXLS
shelled out to a bundled Perl script). Output and behavior are
otherwise unchanged.%>%) with the base R native pipe
(|>) in vignettes and examples; magrittr is no longer used.getPedMaxAge() now returns NA instead of -Inf when a pedigree
has no non-missing ages, so the age-sex pyramid plot renders cleanly
instead of deriving a spurious -Inf axis bound. (#121)makeSimPed() now preserves a known parent instead of overwriting
it with a random candidate, correcting createSimKinships() and
cumulateSimKinships() for animals with one known and one unknown
parent. (Changes simulated-kinship values for affected pedigrees.)makeGrpNum() has been renamed to makeGroupNum() for
naming consistency with the sibling export makeGroupMembers(); the
old name is kept as a deprecated alias.sire
and dam columns, showing which animals have an unknown parent.species as a first-class
column: it is recognized and placed immediately after sex in the
canonical column order, and typed as character, rather than
surviving as an untyped trailing column.getPedDirectRelatives(unrelatedParents = TRUE) now returns a
placeholder ego record for a referenced parent with no record of its
own, instead of erroring; previously dormant since no caller
exercised the TRUE branch. (#114)cannot open file ... console warning when the focal-id list file
is missing or unreadable; the classed error it already reported is
unchanged.@return and parameter
descriptions, dataset titles and descriptions, and the @examples
for getPedDirectRelatives(), cumulateSimKinships(), and
getIdsWithOneParent().inst/extdata/example_nprcgenekeepr_config) now documents that
lkPedColumns is center-specific: SNPRC uses the flat dam/sire
columns (direct columns) while ONPRC uses the Id/parents/dam
lookup-traversal form (curated parentage).data(examplePedigree) now includes a fromCenter (colony-origin)
column, derived from its existing origin/recordStatus fields, so
the Potential Parents tab can show a populated result (1,587 animals
with an unknown parent) against the package's own example data
instead of only its graceful-degradation message.get_elapsed_time_str() to use a mocked
version of proc.time()runGeneKeepR() is protected with
if (interactive()) {}.getVersion() more robust.getPedDirectRelative() so that all direct relatives are
found. Supplemented unit tests for more direct relative types.trimPedigree().as.character(date_object) to format(date_object) in
getDatedFileName.R to prepare for newer code in development version
of
18.lintr::lint_dir("R")getMinParentAge() as it was never used.rbind() with rbindlist() from data.table
were possible.shiny 1.6
that removed an internal shiny function (shiny:::%OR%) and
replaced it with rlang::%||%markdown to suggest due to new changes in knitr.%OR% to rlang::%||% in server.R since
the update to 1.6 of shiny broke the code. Thanks to Dan Metzger of
Wisconsin National Primate Research Center.Shiny in the
description section of the DESCRIPTION file as it is the name of
the type of application and is not being used as the name of the
package. The use of the capitalization is consistent with the
capitalization used within the documentation for the shiny
package (?shiny, See the Details section, first sentence where it
is used as the type of tutorial.) and all documentation and
tutorials provided by the author and RStudio where it is
capitalized everywhere except when referring to the package.runGeneKeepr(), which starts the Shiny applicationgetFocalAnimalPed(), which is dependent on a valid LabKey
instance, a proper configuration file, and a .netrc or _netrc
authentication file.create_wkbk()createPedTree()findLoops()countLoops()makeExamplePedigreeFile()\arguments missing do not take
arguments.:::) for exported functions.:::).tabpanel() do
not have examples.makeExamplePedigreeFile with \dontrun{}
because R 4.0.0 alpha was leaving the side effect of the dataframe
stored in a CSV file named as the text of the next line.spelling::spell_check_package(".").roxygen2 comments that will go
into the Rd-files. Since I have tests, I am wrapping the examples in
.par() in getPyramidPlot.R to reset
par() withopar <- par(no.readonly =TRUE)on.exit(par(opar))\tempdir().