A base R equivalent would be:
+
+example_isolates$mo <- mo_fullname(example_isolates$mo)
+example_isolates[which(mo_is_gram_negative() &
+ mo_is_intrinsic_resistant(ab = "cefotax")),
+ c("mo", aminoglycosides(), carbapenems())]
This package is available here on the official R network (CRAN), which has a peer-reviewed submission process. Install this package in R from CRAN by using the command:
-+install.packages("AMR")
It will be downloaded and installed automatically. For RStudio, click on the menu Tools > Install Packages… and then type in “AMR” and press Install.
Note: Not all functions on this website may be available in this latest release. To use all functions and data sets mentioned on this website, install the latest development version.
@@ -349,7 +357,7 @@ Since you are one of our users, we would like to know how you use the package an Latest development versionThe latest and unpublished development version can be installed from GitHub using:
-diff --git a/docs/news/index.html b/docs/news/index.html index 172d21c9..a383bc88 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -81,7 +81,7 @@+install.packages("remotes") remotes::install_github("msberends/AMR")
NEWS.md
Functions mo_is_gram_negative()
and mo_is_gram_positive()
as wrappers around mo_gramstain()
. They always return TRUE
or FALSE
(except when the input is NA
or the MO code is UNKNOWN
), thus always return FALSE
for species outside the taxonomic kingdom of Bacteria.
Function mo_is_intrinsic_resistant()
to test for intrinsic resistance, based on EUCAST Intrinsic Resistance and Unusual Phenotypes v3.2 from 2020.
Functions random_mic()
, random_disk()
and random_rsi()
for random number generation. They take microorganism names and antibiotic names as input to make generation more realistic.
Functions random_mic()
, random_disk()
and random_rsi()
for random value generation. The functions random_mic()
and random_disk()
take microorganism names and antibiotic names as input to make generation more realistic.
Some functions are now context-aware when used inside dplyr
verbs, such as filter()
, mutate()
and summarise()
. This means that then the data argument does not need to be set anymore. This is the case for the new functions mo_is_gram_negative()
, mo_is_gram_positive()
, mo_is_intrinsic_resistant()
and for the existing functions first_isolate()
, key_antibiotics()
, mdro()
, brmo()
, mrgn()
, mdr_tb()
, mdr_cmi2012()
, eucast_exceptional_phenotypes()
. This was already the case for antibiotic selection functions (such as using penicillins()
in dplyr::select()
).
Some functions are now context-aware when used inside dplyr
verbs, such as filter()
, mutate()
and summarise()
. This means that then the data argument does not need to be set anymore. This is the case for the new functions:
… and for the existing functions:
+first_isolate()
,key_antibiotics()
,mdro()
,brmo()
,mrgn()
,mdr_tb()
,mdr_cmi2012()
,eucast_exceptional_phenotypes()
# to select first isolates that are Gram-negative
@@ -291,6 +314,14 @@
select(mo, cephalosporins(), aminoglycosides()) %>%
as_tibble()
For antibiotic selection functions (such as cephalosporins()
, aminoglycosides()
) to select columns based on a certain antibiotic group, the dependency on the tidyselect
package was removed, meaning that they can now also be used without the need to have this package installed and now also work in base R function calls:
+
+# above example in base R:
+example_isolates[which(first_isolate() & mo_is_gram_negative()),
+ c("mo", cephalosporins(), aminoglycosides())]
For all function arguments in the code, it is now defined what the exact type of user input should be (inspired by the typed
package). If the user input for a certain function does not meet the requirements for a specific argument (such as the class or length), an informative error will be thrown. This makes the package more robust and the use of it more reproducible and reliable. In total, more than 420 arguments were defined.
Fix for set_mo_source()
, that previously would not remember the file location of the original file
Deprecated function p_symbol()
that not really fits the scope of this package. It will be removed in a future version. See here for the source code to preserve it.
Fix for printing class NA
Fix for mo_shortname()
when the input contains NA
If as.mo()
takes more than 30 seconds, some suggestions will be done to improve speed
Lost dependency on the tidyselect
package for using antibiotic selectors such as carbapenems()
and aminoglycosides()
Data set intrinsic_resistant
. This data set contains all bug-drug combinations where the ‘bug’ is intrinsic resistant to the ‘drug’ according to the latest EUCAST insights. It contains just two columns: microorganism
and antibiotic
.
Curious about which enterococci are actually intrinsic resistant to vancomycin?
-+library(AMR) library(dplyr) @@ -361,7 +391,7 @@
Support for using
-dplyr
’sacross()
to interpret MIC values or disk zone diameters, which also automatically determines the column with microorganism names or codes.+# until dplyr 1.0.0 your_data %>% mutate_if(is.mic, as.rsi) @@ -379,7 +409,7 @@
Added intelligent data cleaning to
-as.disk()
, so numbers can also be extracted from text and decimal numbers will always be rounded up:+as.disk(c("disk zone: 23.4 mm", 23.4)) #> Class <disk> @@ -440,7 +470,7 @@
Function
ab_from_text()
to retrieve antimicrobial drug names, doses and forms of administration from clinical texts in e.g. health care records, which also corrects for misspelling since it usesas.ab()
internallyTidyverse selection helpers for antibiotic classes, that help to select the columns of antibiotics that are of a specific antibiotic class, without the need to define the columns or antibiotic abbreviations. They can be used in any function that allows selection helpers, like
-dplyr::select()
andtidyr::pivot_longer()
:+library(dplyr) @@ -629,7 +659,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Fixed important floating point error for some MIC comparisons in EUCAST 2020 guideline
Interpretation from MIC values (and disk zones) to R/SI can now be used with
-mutate_at()
of thedplyr
package:+yourdata %>% mutate_at(vars(antibiotic1:antibiotic25), as.rsi, mo = "E. coli") @@ -658,7 +688,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Support for LOINC codes in the
-antibiotics
data set. Useab_loinc()
to retrieve LOINC codes, or use a LOINC code for input in anyab_*
function:+ab_loinc("ampicillin") #> [1] "21066-6" "3355-5" "33562-0" "33919-2" "43883-8" "43884-6" "87604-5" @@ -669,7 +699,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Support for SNOMED CT codes in the
-microorganisms
data set. Usemo_snomed()
to retrieve SNOMED codes, or use a SNOMED code for input in anymo_*
function:+mo_snomed("S. aureus") #> [1] 115329001 3092008 113961008 @@ -734,11 +764,11 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
If you were dependent on the old Enterobacteriaceae family e.g. by using in your code:
-+if (mo_family(somebugs) == "Enterobacteriaceae") ...
then please adjust this to:
-+@@ -752,7 +782,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/if (mo_order(somebugs) == "Enterobacterales") ...
Functions
-susceptibility()
andresistance()
as aliases ofproportion_SI()
andproportion_R()
, respectively. These functions were added to make it more clear that “I” should be considered susceptible and not resistant.+library(dplyr) example_isolates %>% @@ -781,7 +811,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
More intelligent way of coping with some consonants like “l” and “r”
Added a score (a certainty percentage) to
-mo_uncertainties()
, that is calculated using the Levenshtein distance:+as.mo(c("Stafylococcus aureus", "staphylokok aureuz")) @@ -840,14 +870,14 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Determination of first isolates now excludes all ‘unknown’ microorganisms at default, i.e. microbial code
-"UNKNOWN"
. They can be included with the new argumentinclude_unknown
:+first_isolate(..., include_unknown = TRUE)
For WHONET users, this means that all records/isolates with organism code
"con"
(contamination) will be excluded at default, sinceas.mo("con") = "UNKNOWN"
. The function always shows a note with the number of ‘unknown’ microorganisms that were included or excluded.For code consistency, classes
-ab
andmo
will now be preserved in any subsetting or assignment. For the sake of data integrity, this means that invalid assignments will now result inNA
:+# how it works in base R: x <- factor("A") @@ -872,7 +902,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Function
-bug_drug_combinations()
to quickly get adata.frame
with the results of all bug-drug combinations in a data set. The column containing microorganism codes is guessed automatically and its input is transformed withmo_shortname()
at default:+x <- bug_drug_combinations(example_isolates) #> NOTE: Using column `mo` as input for `col_mo`. @@ -895,13 +925,13 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/ #> 4 Gram-negative AMX 227 0 405 632 #> NOTE: Use 'format()' on this result to get a publicable/printable format.
You can format this to a printable format, ready for reporting or exporting to e.g. Excel with the base R
-format()
function:+format(x, combine_IR = FALSE)
Additional way to calculate co-resistance, i.e. when using multiple antimicrobials as input for
-portion_*
functions orcount_*
functions. This can be used to determine the empiric susceptibility of a combination therapy. A new argumentonly_all_tested
(which defaults toFALSE
) replaces the oldalso_single_tested
and can be used to select one of the two methods to count isolates and calculate portions. The difference can be seen in this example table (which is also on theportion
andcount
help pages), where the %SI is being determined:+# -------------------------------------------------------------------- # only_all_tested = FALSE only_all_tested = TRUE @@ -923,7 +953,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
-
tibble
printing support for classesrsi
,mic
,disk
,ab
mo
. When usingtibble
s containing antimicrobial columns, valuesS
will print in green, valuesI
will print in yellow and valuesR
will print in red. Microbial IDs (classmo
) will emphasise on the genus and species, not on the kingdom.+# (run this on your own console, as this page does not support colour printing) library(dplyr) @@ -1006,7 +1036,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Function
-rsi_df()
to transform adata.frame
to a data set containing only the microbial interpretation (S, I, R), the antibiotic, the percentage of S/I/R and the number of available isolates. This is a convenient combination of the existing functionscount_df()
andportion_df()
to immediately show resistance percentages and number of available isolates:+septic_patients %>% select(AMX, CIP) %>% @@ -1033,7 +1063,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
- UPEC (Uropathogenic E. coli)
All these lead to the microbial ID of E. coli:
-+as.mo("UPEC") # B_ESCHR_COL @@ -1138,7 +1168,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
when all values are unique it now shows a message instead of a warning
support for boxplots:
-+septic_patients %>% freq(age) %>% @@ -1233,7 +1263,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
New filters for antimicrobial classes. Use these functions to filter isolates on results in one of more antibiotics from a specific class:
-+filter_aminoglycosides() filter_carbapenems() @@ -1247,7 +1277,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/ filter_macrolides() filter_tetracyclines()
The
-antibiotics
data set will be searched, after which the input data will be checked for column names with a value in any abbreviations, codes or official names found in theantibiotics
data set. For example:+septic_patients %>% filter_glycopeptides(result = "R") # Filtering on glycopeptide antibacterials: any of `vanc` or `teic` is R @@ -1256,7 +1286,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
All
-ab_*
functions are deprecated and replaced byatc_*
functions:+ab_property -> atc_property() ab_name -> atc_name() @@ -1277,7 +1307,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
New function
age_groups()
to split ages into custom or predefined groups (like children or elderly). This allows for easier demographic antimicrobial resistance analysis per age group.New function
-ggplot_rsi_predict()
as well as the base Rplot()
function can now be used for resistance prediction calculated withresistance_predict()
:+x <- resistance_predict(septic_patients, col_ab = "amox") plot(x) @@ -1285,13 +1315,13 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Functions
-filter_first_isolate()
andfilter_first_weighted_isolate()
to shorten and fasten filtering on data sets with antimicrobial results, e.g.:+septic_patients %>% filter_first_isolate(...) # or filter_first_isolate(septic_patients, ...)
is equal to:
-+septic_patients %>% mutate(only_firsts = first_isolate(septic_patients, ...)) %>% @@ -1324,7 +1354,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Now handles incorrect spelling, like
-i
instead ofy
andf
instead ofph
:+# mo_fullname() uses as.mo() internally @@ -1336,7 +1366,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Uncertainty of the algorithm is now divided into four levels, 0 to 3, where the default
-allow_uncertain = TRUE
is equal to uncertainty level 2. Run?as.mo
for more info about these levels.+# equal: as.mo(..., allow_uncertain = TRUE) @@ -1351,7 +1381,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
All microbial IDs that found are now saved to a local file
~/.Rhistory_mo
. Use the new functionclean_mo_history()
to delete this file, which resets the algorithms.Incoercible results will now be considered ‘unknown’, MO code
-UNKNOWN
. On foreign systems, properties of these will be translated to all languages already previously supported: German, Dutch, French, Italian, Spanish and Portuguese:+mo_genus("qwerty", language = "es") # Warning: @@ -1401,7 +1431,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Support for tidyverse quasiquotation! Now you can create frequency tables of function outcomes:
-+# Determine genus of microorganisms (mo) in `septic_patients` data set: # OLD WAY @@ -1485,7 +1515,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Fewer than 3 characters as input for
as.mo
will return NAFunction
-as.mo
(and allmo_*
wrappers) now supports genus abbreviations with “species” attached+as.mo("E. species") # B_ESCHR mo_fullname("E. spp.") # "Escherichia species" @@ -1502,7 +1532,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Support for grouping variables, test with:
-+septic_patients %>% group_by(hospital_id) %>% @@ -1510,7 +1540,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Support for (un)selecting columns:
-+septic_patients %>% freq(hospital_id) %>% @@ -1590,7 +1620,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
They also come with support for German, Dutch, French, Italian, Spanish and Portuguese:
-+mo_gramstain("E. coli") # [1] "Gram negative" @@ -1601,7 +1631,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/ mo_fullname("S. group A", language = "pt") # Portuguese # [1] "Streptococcus grupo A"
Furthermore, former taxonomic names will give a note about the current taxonomic name:
-+mo_gramstain("Esc blattae") # Note: 'Escherichia blattae' (Burgess et al., 1973) was renamed 'Shimwellia blattae' (Priest and Barker, 2010) @@ -1616,7 +1646,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Function
is.rsi.eligible
to check for columns that have valid antimicrobial results, but do not have thersi
class yet. Transform the columns of your raw data with:data %>% mutate_if(is.rsi.eligible, as.rsi)
Functions
-as.mo
andis.mo
as replacements foras.bactid
andis.bactid
(since themicrooganisms
data set not only contains bacteria). These last two functions are deprecated and will be removed in a future release. Theas.mo
function determines microbial IDs using intelligent rules:+as.mo("E. coli") # [1] B_ESCHR_COL @@ -1625,7 +1655,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/ as.mo("S group A") # [1] B_STRPTC_GRA
And with great speed too - on a quite regular Linux server from 2007 it takes us less than 0.02 seconds to transform 25,000 items:
-+thousands_of_E_colis <- rep("E. coli", 25000) microbenchmark::microbenchmark(as.mo(thousands_of_E_colis), unit = "s") @@ -1659,7 +1689,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Added three antimicrobial agents to the
antibiotics
data set: Terbinafine (D01BA02), Rifaximin (A07AA11) and Isoconazole (D01AC05)Added 163 trade names to the
-antibiotics
data set, it now contains 298 different trade names in total, e.g.:+ab_official("Bactroban") # [1] "Mupirocin" @@ -1676,7 +1706,7 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Added arguments
minimum
andas_percent
toportion_df
Support for quasiquotation in the functions series
-count_*
andportions_*
, andn_rsi
. This allows to check for more than 2 vectors or columns.+septic_patients %>% select(amox, cipr) %>% count_IR() # which is the same as: @@ -1696,12 +1726,12 @@ This works for all drug combinations, such as ampicillin/sulbactam, ceftazidime/
Added longest en shortest character length in the frequency table (
freq
) header of classcharacter
Support for types (classes) list and matrix for
-freq
+For lists, subsetting is possible:
-diff --git a/git_premaster.sh b/git_premaster.sh index 49921590..a41e7a45 100755 --- a/git_premaster.sh +++ b/git_premaster.sh @@ -123,9 +123,9 @@ echo echo "••••••••••••••••••••" echo "• Building package •" echo "••••••••••••••••••••" -echo "• Removing old build..." +echo "• Removing old build from 'data-raw/'..." rm data-raw/AMR_*.tar.gz -echo "• Building to 'data-raw'..." +echo "• Building 'data-raw/AMR_${new_version}.tar.gz'..." Rscript -e "x <- devtools::build(path = 'data-raw', vignettes = FALSE, manual = FALSE, binary = FALSE, quiet = TRUE)" echo "• Installing..." Rscript -e "devtools::install(quiet = TRUE, dependencies = FALSE)" diff --git a/index.md b/index.md index bb2a0324..f8a7871a 100644 --- a/index.md +++ b/index.md @@ -35,6 +35,8 @@ example_isolates %>% select(mo, aminoglycosides(), carbapenems()) #> NOTE: Using column 'mo' as input for mo_is_gram_negative() #> NOTE: Using column 'mo' as input for mo_is_intrinsic_resistant() +#> NOTE: Determining intrinsic resistance based on 'EUCAST Expert Rules' and +#> 'EUCAST Intrinsic Resistance and Unusual Phenotypes' v3.2 from 2020. #> Selecting aminoglycosides: 'AMK' (amikacin), 'GEN' (gentamicin), #> 'KAN' (kanamycin), 'TOB' (tobramycin) #> Selecting carbapenems: 'IPM' (imipenem), 'MEM' (meropenem) @@ -52,6 +54,15 @@ With only having defined a row filter on Gram-negative bacteria with intrinsic r |*Stenotrophomonas maltophilia* | R | R | R | R | R | R | |*Pseudomonas aeruginosa* | S | S | R | S | | S | +A base R equivalent would be: + +```r +example_isolates$mo <- mo_fullname(example_isolates$mo) +example_isolates[which(mo_is_gram_negative() & + mo_is_intrinsic_resistant(ab = "cefotax")), + c("mo", aminoglycosides(), carbapenems())] +``` + #### Partners The development of this package is part of, related to, or made possible by: diff --git a/tests/testthat/test-zzz.R b/tests/testthat/test-zzz.R index 30500af1..c9cffce0 100644 --- a/tests/testthat/test-zzz.R +++ b/tests/testthat/test-zzz.R @@ -29,16 +29,13 @@ test_that("imports work", { skip_on_cran() # Check if these function still exist in the package (all are in Suggests field) - # Since GitHub Action runs every night, we will be emailed when a dependency fails based on this unit test + # Since GitHub Action runs every night, we will get emailed when a dependency fails based on this unit test + + # functions used by import_fn() import_functions <- c( "anti_join" = "dplyr", "cur_column" = "dplyr", - "cur_data" = "dplyr", - "document_position" = "rstudioapi", - "document_range" = "rstudioapi", - "freq.default" = "cleaner", "full_join" = "dplyr", - "getSourceEditorContext" = "rstudioapi", "has_internet" = "curl", "html_attr" = "rvest", "html_children" = "rvest", @@ -46,22 +43,75 @@ test_that("imports work", { "html_nodes" = "rvest", "html_table" = "rvest", "html_text" = "rvest", - "inline_hist" = "skimr", "inner_join" = "dplyr", "insertText" = "rstudioapi", "left_join" = "dplyr", "new_pillar_shaft_simple" = "pillar", - "read_excel" = "readxl", "read_html" = "xml2", "right_join" = "dplyr", "semi_join" = "dplyr", - "sfl" = "skimr", "showQuestion" = "rstudioapi") + # functions that are called directly + call_functions <- c( + # cleaner + "freq.default" = "cleaner", + # skmir + "inline_hist" = "skimr", + "sfl" = "skimr", + # set_mo_source + "read_excel" = "readxl", + # ggplot_rsi + "aes_string" = "ggplot2", + "element_blank" = "ggplot2", + "element_line" = "ggplot2", + "element_text" = "ggplot2", + "facet_wrap" = "ggplot2", + "geom_text" = "ggplot2", + "ggplot" = "ggplot2", + "labs" = "ggplot2", + "layer" = "ggplot2", + "position_fill" = "ggplot2", + "scale_fill_manual" = "ggplot2", + "scale_y_continuous" = "ggplot2", + "theme" = "ggplot2", + "theme_minimal" = "ggplot2", + # ggplot_pca + "aes" = "ggplot2", + "arrow" = "ggplot2", + "element_blank" = "ggplot2", + "element_line" = "ggplot2", + "element_text" = "ggplot2", + "expand_limits" = "ggplot2", + "geom_path" = "ggplot2", + "geom_point" = "ggplot2", + "geom_segment" = "ggplot2", + "geom_text" = "ggplot2", + "ggplot" = "ggplot2", + "labs" = "ggplot2", + "theme" = "ggplot2", + "theme_minimal" = "ggplot2", + "unit" = "ggplot2", + "xlab" = "ggplot2", + "ylab" = "ggplot2", + # resistance_predict + "aes" = "ggplot2", + "geom_errorbar" = "ggplot2", + "geom_point" = "ggplot2", + "geom_ribbon" = "ggplot2", + "ggplot" = "ggplot2", + "labs" = "ggplot2" + ) + + import_functions <- c(import_functions, call_functions) + + # check if all are in Suggests field + expect_true(all(unique(import_functions) %in% strsplit(packageDescription("AMR")$Suggests, ",\n")[[1]])) + for (i in seq_len(length(import_functions))) { fn <- names(import_functions)[i] pkg <- unname(import_functions[i]) expect(!is.null(import_fn(name = fn, pkg = pkg, error_on_fail = FALSE)), - failure_message = paste0("Function ", pkg, "::", fn, "() does not exist")) + failure_message = paste0("Function ", pkg, "::", fn, "() does not exist anymore")) } })+diff --git a/docs/survey.html b/docs/survey.html index e54ae32b..b64c607b 100644 --- a/docs/survey.html +++ b/docs/survey.html @@ -81,7 +81,7 @@my_list = list(age = septic_patients$age, gender = septic_patients$gender) my_list %>% freq(age) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 5f348f04..20be7fcd 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -12,7 +12,7 @@ articles: datasets: datasets.html resistance_predict: resistance_predict.html welcome_to_AMR: welcome_to_AMR.html -last_built: 2020-12-31T12:43Z +last_built: 2021-01-03T22:35Z urls: reference: https://msberends.github.io/AMR//reference article: https://msberends.github.io/AMR//articles diff --git a/docs/reference/index.html b/docs/reference/index.html index 3171c83f..40cb648c 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -81,7 +81,7 @@