From 06e8e56dff7960b82d1ea86142fa9699ae0cece8 Mon Sep 17 00:00:00 2001 From: "Robin K. S. Hankin" Date: Wed, 16 Aug 2023 09:02:35 +0000 Subject: [PATCH] version 0.0-3 --- DESCRIPTION | 24 +- MD5 | 56 +- NEWS.md | 15 + R/RcppExports.R | 36 ++ R/frab.R | 104 +++- R/sparsetable.R | 415 +++++++++++++++ README.md | 207 +++++++- build/frab.pdf | Bin 138551 -> 160397 bytes build/partial.rdb | Bin 4330 -> 4463 bytes build/stage23.rdb | Bin 6045 -> 6045 bytes build/vignette.rds | Bin 211 -> 212 bytes inst/doc/frab.R | 20 + inst/doc/frab.Rmd | 51 +- inst/doc/frab.html | 97 +++- inst/frab.bib | 38 ++ inst/frab_arxiv.Rnw | 1031 +++++++++++++++++++++++++++++++++++++ inst/read.me | 28 + inst/wittgenstein.Rmd | 42 ++ man/Arith.Rd | 16 +- man/Compare.Rd | 7 +- man/Extract.Rd | 19 +- man/frab-class.Rd | 3 - man/frab.Rd | 6 + man/misc.Rd | 26 +- man/sparsetable.Rd | 196 +++++++ src/RcppExports.cpp | 131 +++++ src/frab.cpp | 28 + src/sparsetable_ops.cpp | 262 ++++++++++ tests/testthat/test_aaa.R | 114 +++- tests/testthat/test_aab.R | 7 + tests/testthat/test_aac.R | 265 ++++++++++ tests/testthat/test_aad.R | 75 +++ vignettes/frab.Rmd | 51 +- vignettes/frab.bib | 14 +- 34 files changed, 3282 insertions(+), 102 deletions(-) create mode 100644 NEWS.md create mode 100644 R/sparsetable.R create mode 100644 inst/frab.bib create mode 100644 inst/frab_arxiv.Rnw create mode 100644 inst/read.me create mode 100644 inst/wittgenstein.Rmd create mode 100644 man/sparsetable.Rd create mode 100644 src/sparsetable_ops.cpp create mode 100644 tests/testthat/test_aac.R create mode 100644 tests/testthat/test_aad.R diff --git a/DESCRIPTION b/DESCRIPTION index 8d1c366..3501a90 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,18 +1,20 @@ Package: frab Type: Package -Title: An Alternative Interpretation of Named Vectors -Version: 0.0-1 +Title: How to Add Two Tables +Version: 0.0-3 Authors@R: person(given=c("Robin", "K. S."), family="Hankin", role = c("aut","cre"), email="hankin.robin@gmail.com", comment = c(ORCID = "0000-0001-5982-0415")) Maintainer: Robin K. S. Hankin -Description: An alternative interpretation of named vectors as - generalized tables, so that c(a=1,b=2,c=3) + c(b=3,a=-1) will - return c(b=5,c=3). Uses 'disordR' discipline (Hankin, 2022, - ). Extraction and replacement - methods are provided. The underlying mathematical structure is - the Free Abelian group, hence the name. +Description: Methods to "add" two tables; also an alternative + interpretation of named vectors as generalized tables, so that + c(a=1,b=2,c=3) + c(b=3,a=-1) will return c(b=5,c=3). Uses + 'disordR' discipline (Hankin, 2022, ). + Extraction and replacement methods are provided. The underlying + mathematical structure is the Free Abelian group, hence the name. + To cite in publications please use Hankin (2023) + . License: GPL (>= 2) Depends: R (>= 3.5.0) -Suggests: knitr, markdown, rmarkdown, testthat +Suggests: knitr, markdown, rmarkdown, testthat, mvtnorm VignetteBuilder: knitr Imports: Rcpp (>= 1.0-7), mathjaxr, disordR (>= 0.9-8-1), methods LinkingTo: Rcpp @@ -20,7 +22,7 @@ URL: https://github.com/RobinHankin/frab BugReports: https://github.com/RobinHankin/frab RdMacros: mathjaxr NeedsCompilation: yes -Packaged: 2023-07-19 21:37:40 UTC; rhankin +Packaged: 2023-08-15 23:57:04 UTC; rhankin Author: Robin K. S. Hankin [aut, cre] () Repository: CRAN -Date/Publication: 2023-07-20 11:20:02 UTC +Date/Publication: 2023-08-16 09:02:35 UTC diff --git a/MD5 b/MD5 index c0d98dd..210c267 100644 --- a/MD5 +++ b/MD5 @@ -1,34 +1,44 @@ -5061f6385aff6a83e8baad22fc5faa8d *DESCRIPTION +c5ce79e255519bae4ff515c8d28f4f71 *DESCRIPTION 55e0cf44c1a5c0e1ea52ca6bd526b242 *NAMESPACE -868be7dc206df4f129d20419aad0a976 *R/RcppExports.R -5fbaabf29578c25827e6b0e4769c9afe *R/frab.R -61ae6ae99ef7a8c14b6b97185f446c71 *README.md -b1870707d2b690351f4c7f515f90a24f *build/frab.pdf -68865b88cfa1f13c38ca79af192d28ff *build/partial.rdb -160d6dfb46956e52b633848573847aed *build/stage23.rdb -06c8dac28c5e939c6af6592635f694e3 *build/vignette.rds -d385e72c2f60e980006f1ec48eb3b4a1 *inst/doc/frab.R -f787f9bf341b82267132833e40263a09 *inst/doc/frab.Rmd -5d019a465de919645b02f3a3847cc906 *inst/doc/frab.html -3b9e3ed50c0b8ffa0c7d5cc793a7dd4f *man/Arith.Rd -5c51a0d12de2c5a2909271a3d1975d39 *man/Compare.Rd -7ed1312f15bad6ae61b053f88902cd84 *man/Extract.Rd +2f8bd80de715cde904dfc8430a47cb85 *NEWS.md +ff2988afb5dc1fad914fc6f1b90585cf *R/RcppExports.R +5e92e3d8d9847f5c3b0c59077d27b803 *R/frab.R +5ea61be7cb5e3c72236773ccd15a69b0 *R/sparsetable.R +d3efe4d379e4985a05ae467269ff8b5e *README.md +f36a9abac32324778b7ce1aecc16cd80 *build/frab.pdf +5b34e07bb2f5f9fac47e07ba59581ef0 *build/partial.rdb +0ac9cace5052ba8cbcb6a029f6a8eafe *build/stage23.rdb +ee23a57ddc61e60b2ca2b956a157605d *build/vignette.rds +61cd24468278a2c74bea8ae24c335166 *inst/doc/frab.R +0cff9a2f802561af620671db34a793b6 *inst/doc/frab.Rmd +1c4110d8c1af85b8053a38022c10d268 *inst/doc/frab.html +47a0055c494ebee78647cc56b8f5cadf *inst/frab.bib +f0465c6b8a13269fab9d99f8aa266527 *inst/frab_arxiv.Rnw +d29784da0b905da88244b5a5c40f2fdc *inst/read.me +a5aac65fb29bf3430f1e7e8b7f717749 *inst/wittgenstein.Rmd +316dd6430416f86fdc133737ce7c34af *man/Arith.Rd +308adc135b1aad80fd826a6a9fb7ae0c *man/Compare.Rd +190453a31e19248c587d5706c73ecb1f *man/Extract.Rd 0e38107b0ebeccecfc57cab27e7529fd *man/figures/frab.png -9a60484529733e2ab3c431106041f1a6 *man/frab-class.Rd +ceaca23242a1baa9d8fd2dc3a93b6163 *man/frab-class.Rd 300bf5b585a4b58d36105cbadb306092 *man/frab-package.Rd -dd68f9458a0069b5023c88198550cd72 *man/frab.Rd -d868cd2cfe4b8250f5c8b44c33a4dd6c *man/misc.Rd +05c3919de40c5344a16a2acd78d2eb48 *man/frab.Rd +9098c88fb16e6152646639f9c5486858 *man/misc.Rd 2966ded66d965c0c31c9c3eca0a2a916 *man/namedvector.Rd 680350e287b311cc55c30fed88cb9ed3 *man/pmax.Rd 7026a022f968605cdf89f2ac997f6979 *man/print.Rd 64ff6a2224e515d260be98513c02c97f *man/rfrab.Rd +123d72827e9188318b9243c9cb31160c *man/sparsetable.Rd 6f249b0f0c53fddd870854e344936e17 *man/table.Rd 89f8675cf461379a8c0f224f4917b4b4 *man/zero.Rd -616ea317e88c1aac6cedb199c835e5ec *src/RcppExports.cpp -04dc8cbd76b5bcc8a858ec91dcc5a44b *src/frab.cpp +d78e2af1f3ebf698083a133f355afd9e *src/RcppExports.cpp +f6b5e8fed1acee228a850a03c75a9a5b *src/frab.cpp 2d0eddd0677a2b902568cdacdbf125cb *src/frab.h +47f31a21c0cd8fc66314309354ea187f *src/sparsetable_ops.cpp 9e68b0a4b1df7d52541fa46fff582d29 *tests/testthat.R -d645568bd1aa4d8ecd32857541701db4 *tests/testthat/test_aaa.R -3ff3363c5e04cb4d05ca9809881db10c *tests/testthat/test_aab.R -f787f9bf341b82267132833e40263a09 *vignettes/frab.Rmd -aa694962e8901d679115abaf2386f83e *vignettes/frab.bib +3e79d52355dae72090cf1eb0ec4b5902 *tests/testthat/test_aaa.R +b7f4a07171618298ad285c1502062e95 *tests/testthat/test_aab.R +6358c120726711bbe0edcd3cc4030cba *tests/testthat/test_aac.R +a82f9f28656912b8f25fd647d5238c0c *tests/testthat/test_aad.R +0cff9a2f802561af620671db34a793b6 *vignettes/frab.Rmd +700ee49f464ee71ac60824b6b60955e1 *vignettes/frab.bib diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..d583f09 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,15 @@ +# frab 0.0-1 + +- initial release + + +# frab 0.0-2 + +- multiplication method +- new arxiv preprint +- new draft vignette in inst/ + +# frab 0.0-3 + +- sparsetable functionality +- near complete test coverage \ No newline at end of file diff --git a/R/RcppExports.R b/R/RcppExports.R index c9490da..e8a6e0d 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -9,6 +9,10 @@ c_frab_add <- function(names1, values1, names2, values2) { .Call(`_frab_c_frab_add`, names1, values1, names2, values2) } +c_frab_multiply <- function(names1, values1, names2, values2) { + .Call(`_frab_c_frab_multiply`, names1, values1, names2, values2) +} + c_frab_pmax <- function(names1, values1, names2, values2) { .Call(`_frab_c_frab_pmax`, names1, values1, names2, values2) } @@ -17,3 +21,35 @@ c_frab_eq <- function(names1, values1, names2, values2) { .Call(`_frab_c_frab_eq`, names1, values1, names2, values2) } +sparsetable_maker <- function(M, d) { + .Call(`_frab_sparsetable_maker`, M, d) +} + +sparsetable_add <- function(M1, d1, M2, d2) { + .Call(`_frab_sparsetable_add`, M1, d1, M2, d2) +} + +sparsetable_overwrite <- function(M1, d1, M2, d2) { + .Call(`_frab_sparsetable_overwrite`, M1, d1, M2, d2) +} + +sparsetable_accessor <- function(M, d, Mindex) { + .Call(`_frab_sparsetable_accessor`, M, d, Mindex) +} + +sparsetable_setter <- function(M1, d1, M2, d2) { + .Call(`_frab_sparsetable_setter`, M1, d1, M2, d2) +} + +sparsetable_equality <- function(M1, d1, M2, d2) { + .Call(`_frab_sparsetable_equality`, M1, d1, M2, d2) +} + +sparsetable_asum_include <- function(M, d, n) { + .Call(`_frab_sparsetable_asum_include`, M, d, n) +} + +sparsetable_pmax <- function(M1, d1, M2, d2) { + .Call(`_frab_sparsetable_pmax`, M1, d1, M2, d2) +} + diff --git a/R/frab.R b/R/frab.R index e35f594..c6c0216 100644 --- a/R/frab.R +++ b/R/frab.R @@ -8,6 +8,19 @@ setMethod("names","frab", return(disord(names(x@x),h=hashcal(x@x))) } ) +setReplaceMethod("names",signature(x="frab",value="disord"), + function(x,value){ + v <- values(x) + stopifnot(consistent(v,value)) + frab(setNames(elements(v),elements(value))) + } ) + +setReplaceMethod("names",signature(x="frab",value="character"), + function(x,value){ + stopifnot(length(x)==1) + frab(setNames(values(x),value)) + } ) + setGeneric("values",function(x){standardGeneric("values")}) setMethod("values","frab", function(x){ @@ -67,6 +80,8 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng return(list_to_frab(x)) } else if(is.1dtable(x)){ return(table_to_frab(x)) + } else if(is.sparsetable(x)){ + return(sparsetable_to_frab(x)) } else if(is.frab(x)){ return(x) } else { @@ -80,11 +95,16 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng as.frab(c_frab_add(elements(names(F1)), elements(values(F1)), elements(names(F2)), elements(values(F2)))) } - -`frab_multiply_numeric` <- function(e1,e2){frab(setNames(elements(values(e1)*e2),elements(names(e1))))} -`frab_power_numeric` <- function(e1,e2){frab(setNames(elements(values(e1)^e2),elements(names(e1))))} -`numeric_multiply_frab` <- function(e1,e2){frab(setNames(elements(e1*values(e2)),elements(names(e2))))} -`numeric_power_frab` <- function(e1,e2){frab(setNames(elements(e1^values(e2)),elements(names(e2))))} + +`frab_multiply_frab` <- function(F1,F2){ + as.frab(c_frab_multiply(elements(names(F1)), elements(values(F1)), + elements(names(F2)), elements(values(F2)))) +} + +`frab_plus_numeric` <- function(e1,e2){if(is.namedvector(e2)){return(e1+frab(e2))}else{return(frab(setNames(elements(values(e1)+e2),elements(names(e1)))))}} +`frab_multiply_numeric` <- function(e1,e2){if(is.namedvector(e2)){stop("not defined")}else{return(frab(setNames(elements(values(e1)*e2),elements(names(e1)))))}} +`frab_power_numeric` <- function(e1,e2){if(is.namedvector(e2)){stop("not defined")}else{return(frab(setNames(elements(values(e1)^e2),elements(names(e1)))))}} +`numeric_power_frab` <- function(e1,e2){stop(" ^ not defined")} `frab_unary` <- function(e1,e2){ switch(.Generic, @@ -100,13 +120,14 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng switch(.Generic, "+" = frab_plus_frab(e1, e2), "-" = frab_plus_frab(e1, frab_negative(e2)), + "*" = frab_multiply_frab(e1, e2), stop(gettextf("binary operator %s not implemented on frabs", dQuote(.Generic))) ) } `frab_arith_numeric` <- function(e1,e2){ # e1 frab, e2 numeric; e2 might be a named vector. switch(.Generic, - "+" = frab_plus_frab(e1, as.frab(e2)), - "-" = frab_plus_frab(e1, frab_negative(as.frab(e2))), + "+" = frab_plus_numeric(e1, e2), + "-" = frab_plus_numeric(e1, -e2), "*" = frab_multiply_numeric(e1,e2), "/" = frab_multiply_numeric(e1,1/e2), "^" = frab_power_numeric(e1,e2), @@ -115,10 +136,10 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng `numeric_arith_frab` <- function(e1,e2){ # e1 numeric, e2 frab; e2 _might_ be a named vector. switch(.Generic, - "+" = frab_plus_frab(as.frab(e1), e2), - "-" = frab_plus_frab(as.frab(e1), -e2), - "*" = numeric_multiply_frab(e1,e2), - "/" = numeric_multiply_frab(e1,frab_reciprocal(e2)), + "+" = frab_plus_numeric( e2,e1), + "-" = frab_plus_numeric(-e2,e1), + "*" = frab_multiply_numeric(e2,e1), + "/" = frab_multiply_numeric(frab_reciprocal(e2),e1), "^" = numeric_power_frab(e1,e2), stop(gettextf("binary operator %s not implemented on frabs", dQuote(.Generic))) ) } @@ -137,6 +158,7 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng } `frab_eq_num` <- function(e1,e2){values(e1) == e2} +`frab_ne_num` <- function(e1,e2){values(e1) != e2} `frab_gt_num` <- function(e1,e2){values(e1) > e2} `frab_ge_num` <- function(e1,e2){values(e1) >= e2} `frab_lt_num` <- function(e1,e2){values(e1) < e2} @@ -145,6 +167,7 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng `frab_compare_numeric` <- function(e1,e2){ # rfrab() > 3 switch(.Generic, "==" = frab_eq_num(e1, e2), + "!=" = frab_ne_num(e1, e2), ">" = frab_gt_num(e1, e2), ">=" = frab_ge_num(e1, e2), "<" = frab_lt_num(e1, e2), @@ -154,6 +177,7 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng `num_eq_frab` <- function(e1,e2){e1 == values(e2)} +`num_ne_frab` <- function(e1,e2){e1 != values(e2)} `num_gt_frab` <- function(e1,e2){e1 > values(e2)} `num_ge_frab` <- function(e1,e2){e1 >= values(e2)} `num_lt_frab` <- function(e1,e2){e1 < values(e2)} @@ -162,6 +186,7 @@ setMethod("as.table","frab",function(x,...){structure(as.namedvector(x),dim=leng `numeric_compare_frab` <- function(e1,e2){ # 4 <= rfrab() switch(.Generic, "==" = num_eq_frab(e1, e2), + "!=" = num_ne_frab(e1, e2), ">" = num_gt_frab(e1, e2), ">=" = num_ge_frab(e1, e2), "<" = num_lt_frab(e1, e2), @@ -250,6 +275,12 @@ setReplaceMethod("[",signature(x="frab",i="character",j="missing",value="numeric ) }) +setReplaceMethod("[",signature(x="frab",i="character",j="missing",value="logical"), + function(x,i,j,value){ + x[i] <- as.numeric(value) # the meat + return(x) + }) + setReplaceMethod("[",signature(x="frab",i="disord",j="missing",value="numeric"), function(x,i,j,value){ s <- names(x) @@ -268,6 +299,12 @@ setReplaceMethod("[",signature(x="frab",i="disord",j="missing",value="numeric"), ) }) +setReplaceMethod("[",signature(x="frab",i="disord",j="missing",value="logical"), + function(x,i,j,value){ + x[i] <- as.numeric(value) # the meat + return(x) + } ) + setReplaceMethod("[",signature(x="frab",i="disord",j="missing",value="frab"), function(x,i,j,value){ stop("not currently implemented. Idiom such as x[x<0] <- -x[x<0] is disord-compliant [and meaningful] but not yet implemented") @@ -280,13 +317,24 @@ setReplaceMethod("[",signature(x="frab",i="disindex",j="missing",value="numeric" return(frab(setNames(elements(p),names(x)))) } ) -setReplaceMethod("[",signature(x="frab",i="missing",j="missing",value="ANY"), +setReplaceMethod("[",signature(x="frab",i="missing",j="missing",value="numeric"), function(x,i,j,value){ v <- values(x) - v[] <- value + v[] <- value # disord discipline violations trapped here return(frab(setNames(v,names(x)))) } ) +setReplaceMethod("[",signature(x="frab",i="missing",j="missing",value="frab"), + function(x,i,j,value){ + stop("x[] <- y (with x, y frabs) does not make sense; try x <- y?") + } ) + +setReplaceMethod("[",signature(x="frab",i="missing",j="missing",value="ANY"), + function(x,i,j,value){ + stop("frab,missing,missing,ANY-method not implemented") + } ) + + setReplaceMethod("[",signature(x="frab",i="ANY",j="ANY",value="ANY"), function(x,i,j,value){ stop("replacement operation not defined in this case") @@ -323,7 +371,7 @@ setGeneric("pmin",function(...){standardGeneric("pmin")}) } else if(nargs()<3){ return(pmax_pair(x, ...)) } else { - return(pmax_pair(x, pmax_pair(...))) + return(pmax_pair(x, pmax_dots(...))) } } @@ -333,7 +381,7 @@ setGeneric("pmin",function(...){standardGeneric("pmin")}) } else if(nargs()<3){ return(pmin_pair(x, ...)) } else { - return(pmin_pair(x, pmin_pair(...))) + return(pmin_pair(x, pmin_dots(...))) } } @@ -341,13 +389,33 @@ setMethod("pmax",signature("..."="frab"), function(...){pmax_dots(...)} ) setMethod("pmin",signature("..."="frab"), function(...){pmin_dots(...)} ) setMethod("pmax",signature("..."="ANY"),function(...,na.rm=FALSE){base::pmax(..., na.rm=na.rm)}) -setMethod("pmin",signature("..."="ANY"),function(...,na.rm=FALSE){base::pmax(..., na.rm=na.rm)}) +setMethod("pmin",signature("..."="ANY"),function(...,na.rm=FALSE){base::pmin(..., na.rm=na.rm)}) setGeneric("is.na") setMethod("is.na","frab",function(x){which(is.na(values(x)))}) setGeneric("is.na<-") setReplaceMethod("is.na",signature("frab",value="disord"), function(x,value){ - values(x)[value] <- NA - return(x) + v <- values(x) + is.na(v) <- value # the meat + return(frab(setNames(elements(v),elements(names(x))))) } ) + +setGeneric("is.notna",function(x){standardGeneric("is.notna")}) +setMethod("is.notna","frab",function(x){which(!is.na(values(x)))}) + +setMethod("Summary", "frab", + function(x, ..., na.rm=FALSE){ + switch(.Generic, + max = max(values(x)), + min = min(values(x)), + range = c(min(values(x)),max(values(x))), + sum = sum(values(x)), + stop(gettextf("Summary function %s not implemented on frabs", dQuote(.Generic))) + ) + } + ) + + + + diff --git a/R/sparsetable.R b/R/sparsetable.R new file mode 100644 index 0000000..a81ab14 --- /dev/null +++ b/R/sparsetable.R @@ -0,0 +1,415 @@ +setClass("sparsetable", + representation = representation(index="matrix",values="numeric"), + prototype = list(index=matrix(),values=numeric()), + ) + +setGeneric("index",function(x){standardGeneric("index")}) +setMethod("index","sparsetable",function(x){x@index}) +setMethod("values","sparsetable", + function(x){ + disord(as.numeric(x@values),h=hashcal(list(x@index,x@values))) + ## no occurrences of "@" below this line; accessor methods end + } ) + +setMethod("names","sparsetable", + function(x){ + stop("sparsetable objects do not have a 'names' attribute; try dimnames()") + } ) + +setMethod("dimnames","sparsetable",function(x){colnames(index(x))}) +setReplaceMethod("dimnames","sparsetable",function(x,value){ + I <- index(x) + colnames(I) <- value # the meat + return(sparsetable(I,values(x))) +} ) + +setGeneric("nterms",function(x){standardGeneric("nterms")}) +setMethod("nterms","sparsetable",function(x){nrow(index(x))}) + +setValidity("sparsetable",function(object){ + i <- index(object) + v <- values(object) + if(!is.character(i)){ + stop("not a character, we need a character vector") + } else if(nrow(i) != length(v)){ + stop("length of values must match number of rows of index") + } else { + return(TRUE) + } +} ) + +setGeneric("is.empty",function(x){standardGeneric("is.empty")}) +setMethod("is.empty","sparsetable",function(x){nrow(index(x))==0}) +setGeneric("arity",function(x){standardGeneric("arity")}) +setMethod("arity","sparsetable",function(x){ncol(index(x))}) +setMethod("dim","sparsetable",function(x){apply(index(x),2,function(x){length(unique(x))})}) + +setGeneric("as.array") +setMethod("as.array","sparsetable",function(x){sparsetable_to_array(x)}) + +`sparsetable_to_array` <- function(x){ + if(is.empty(x)){return(array(0,rep(0,arity(x))))} + I <- apply(index(x),2,function(x){as.numeric(as.factor(x))}) + dims <- apply(I,2,max) + out <- array(0,dims) + out[I] <- values(x) + L <- apply(index(x),2,function(x){levels(as.factor(x))},simplify=FALSE) + names(L) <- colnames(I) + dimnames(out) <- L + return(out) +} + +`array_to_sparsetable` <- function(x){ + + I <- which(x != 0,arr.ind=TRUE) + J <- I + colnames(J) <- names(dimnames(x)) + for(i in seq_len(ncol(I))){ + J[,i] <- (dimnames(x)[[i]])[I[,i]] # the meat + } + return(sparsetable(J,x[x!=0])) +} + +`sparsetable_to_frab` <- function(x){ + frab(setNames(elements(values(x)),apply(index(x),1,paste,collapse="_"))) +} + +setMethod("show", "sparsetable", function(object){print_sparsetable_matrixform(object)}) + +`print_sparsetable_matrixform` <- function(S){ + if(is.empty(S)){ + cat(paste('empty sparsetable with ', arity(S), ' columns\n',sep="")) + } else if((arity(S)==2) && !isFALSE(getOption("print_2dsparsetables_as_matrices"))){ + print(sparsetable_to_array(S)) + } else { + jj <- + data.frame(index(S),symbol= " = ", val=round(elements(values(S)),getOption("digits"))) + mdc <- colnames(index(S)) + if(is.null(mdc)){ + colnames(jj) <- c(rep(" ",arity(S)+1),'val') + } else { + colnames(jj) <- c(mdc[seq_len(arity(S))],' ','val') + } + print(jj,row.names=FALSE) + } + return(invisible(S)) +} + +`sparsetable` <- function(i,v=1){ + if(length(v)==1){v <- rep(v,nrow(i))} + stopifnot(nrow(i) == length(v)) + jj <- sparsetable_maker(i,v) + if(is.null(jj$index)){ + jj$index <-matrix(character(0),0,ncol(i)) + jj$value <- numeric(0) + } + colnames(jj$index) <- colnames(i) + new("sparsetable",index=jj$index,values=jj$value)} # This is the only time new("sparsetable",...) is called + +`is.sparsetable` <- function(x){inherits(x,"sparsetable")} + +`as.sparsetable` <- function(x){ + if(is.sparsetable(x)){ + return(x) + } else if(is.frab(x)){ + return(sparsetable(cbind(names(x)),values(x))) + } else if(is.list(x)){ + return(sparsetable(x$index,x$value)) + } else if(is.table(x)){ + return(array_to_sparsetable(as.array(x))) + } else if(is.array(x)){ + return(array_to_sparsetable(x)) + } +} + +`sparsetable_negative` <- function(S){ + if(is.zero(S)){ + return(S) + } else { + return(sparsetable(index(S),-values(S))) + } +} + +`sparsetable_eq_sparsetable` <- function(S1,S2){ + if(arity(S1) != arity(S2)){ + return(FALSE) + } else if(nterms(S1) != nterms(S2)){ + return(FALSE) + } else { + return(sparsetable_equality(index(S1),values(S1),index(S2),values(S2))) + } +} + +`rspar` <- function(n=15,l=3,d=3){ + sparsetable( + matrix( + letters[sample(seq_len(l),n*d,replace=TRUE)], + n, d, dimnames=list(NULL,month.abb[seq_len(d)])),seq_len(n)) +} + +`rspar2` <- function(n=15,l=6){ + sparsetable(as.matrix(data.frame( + foo=letters[sample(seq_len(l),n,replace=TRUE)], + bar=LETTERS[sample(seq_len(l),n,replace=TRUE)])), + seq_len(n)) +} + +`rsparr` <- function(n=20,d=6,l=5,s=4){ + I <- sapply(seq_len(d),function(d){sample(replicate(s,paste(sample(letters[seq_len(l)],d,replace=TRUE),collapse="")),n,replace=TRUE)}) + colnames(I) <- month.abb[seq_len(d)] + return(sparsetable(I,seq_len(n))) +} + +`sparsetable_negative` <- function(x){sparsetable(index(x), -values(x))} +`sparsetable_reciprocal` <- function(x){stop("inverse not implemented")} +`sparsetable_plus_sparsetable` <- function(F1,F2){ + stopifnot(arity(F1) == arity(F2)) + out <- ( + sparsetable_add( + index(F1),values(F1), + index(F2),values(F2) + )) + if(is.null(out$index)){ + out$index <- index(F1)[FALSE,] + out$value <- numeric(0) + } + out <- as.sparsetable(out) + if(is.null(dimnames(F1))){ + dimnames(out) <- dimnames(F2) + } else { + dimnames(out) <- dimnames(F1) + } + return(out) +} + +`sparsetable_multiply_sparsetable` <- function(F1,F2){ + stop("multiplication not implemented") +} + +`sparsetable_multiply_numeric` <- function(e1,e2){sparsetable(index(e1),values(e1)*e2)} +`sparsetable_power_numeric` <- function(e1,e2){stop("sparsetable power not implemented")} +`numeric_multiply_sparsetable` <- function(e1,e2){sparsetable_multiply_numeric(e2,e1)} +`numeric_power_sparsetable` <- function(e1,e2){stop("sparsetable power not implemented")} + +`sparsetable_unary` <- function(e1,e2){ + switch(.Generic, + "+" = e1, + "-" = sparsetable_negative(e1), + stop(gettextf("unary operator %s not implemented on sparsetables", dQuote(.Generic))) + ) +} + +`sparsetable_arith_sparsetable` <- function(e1,e2){ + e1 <- as.sparsetable(e1) + e2 <- as.sparsetable(e2) + switch(.Generic, + "+" = sparsetable_plus_sparsetable(e1, e2), + "-" = sparsetable_plus_sparsetable(e1, sparsetable_negative(e2)), + "*" = sparsetable_multiply_sparsetable(e1, e2), + stop(gettextf("binary operator %s not implemented on sparsetables", dQuote(.Generic))) + ) } + +`sparsetable_arith_numeric` <- function(e1,e2){ # e1 sparsetable, e2 numeric; e2 might be a named vector. + switch(.Generic, + "*" = sparsetable_multiply_numeric(e1,e2), + "/" = sparsetable_multiply_numeric(e1,1/e2), + "^" = sparsetable_power_numeric(e1,e2), + stop(gettextf("binary operator %s not implemented in this case", dQuote(.Generic))) + ) } + +`numeric_arith_sparsetable` <- function(e1,e2){ # e1 numeric, e2 sparsetable; e2 _might_ be a named vector. + switch(.Generic, + "*" = numeric_multiply_sparsetable(e1,e2), + "/" = numeric_multiply_sparsetable(e1,sparsetable_reciprocal(e2)), + "^" = numeric_power_sparsetable(e1,e2), + stop(gettextf("binary operator %s not implemented in this case", dQuote(.Generic))) + ) } + + +`sparsetable_compare_sparsetable` <- function(e1,e2){ + switch(.Generic, + "==" = sparsetable_eq_sparsetable(e1, e2), + "!=" = !sparsetable_eq_sparsetable(e1, e2), + stop(gettextf("comparison '%s' not for sparsetables", dQuote(.Generic))) + ) +} + +`sparsetable_eq_num` <- function(e1,e2){values(e1) == e2} +`sparsetable_gt_num` <- function(e1,e2){values(e1) > e2} +`sparsetable_ge_num` <- function(e1,e2){values(e1) >= e2} +`sparsetable_lt_num` <- function(e1,e2){values(e1) < e2} +`sparsetable_le_num` <- function(e1,e2){values(e1) <= e2} + +`sparsetable_compare_numeric` <- function(e1,e2){ # rsparsetable() > 3 + switch(.Generic, + "==" = sparsetable_eq_num(e1, e2), + ">" = sparsetable_gt_num(e1, e2), + ">=" = sparsetable_ge_num(e1, e2), + "<" = sparsetable_lt_num(e1, e2), + "<=" = sparsetable_le_num(e1, e2), + stop(gettextf("Comparison operator %s not implemented in this case", dQuote(.Generic))) + ) } + +`num_eq_sparsetable` <- function(e1,e2){e1 == values(e2)} +`num_gt_sparsetable` <- function(e1,e2){e1 > values(e2)} +`num_ge_sparsetable` <- function(e1,e2){e1 >= values(e2)} +`num_lt_sparsetable` <- function(e1,e2){e1 < values(e2)} +`num_le_sparsetable` <- function(e1,e2){e1 <= values(e2)} + +`numeric_compare_sparsetable` <- function(e1,e2){ # 4 <= rsparsetable() + switch(.Generic, + "==" = num_eq_sparsetable(e1, e2), + ">" = num_gt_sparsetable(e1, e2), + ">=" = num_ge_sparsetable(e1, e2), + "<" = num_lt_sparsetable(e1, e2), + "<=" = num_le_sparsetable(e1, e2), + stop(gettextf("Comparison operator %s not implemented in this case", dQuote(.Generic))) + ) } + +setMethod("Arith" , signature(e1="sparsetable" , e2="missing"), sparsetable_unary ) +setMethod("Arith" , signature(e1="sparsetable" , e2="sparsetable" ), sparsetable_arith_sparsetable ) +setMethod("Arith" , signature(e1="sparsetable" , e2="numeric"), sparsetable_arith_numeric) +setMethod("Arith" , signature(e1="numeric", e2="sparsetable" ), numeric_arith_sparsetable) +setMethod("Arith" , signature(e1="ANY" , e2="sparsetable" ), sparsetable_arith_sparsetable ) +setMethod("Arith" , signature(e1="sparsetable" , e2="ANY" ), sparsetable_arith_sparsetable ) + +setMethod("Compare", signature(e1="sparsetable" , e2="sparsetable" ), sparsetable_compare_sparsetable ) +setMethod("Compare", signature(e1="sparsetable" , e2="numeric"), sparsetable_compare_numeric) +setMethod("Compare", signature(e1="numeric" , e2="sparsetable" ), numeric_compare_sparsetable ) + +setMethod("[", + signature(x="sparsetable",i="ANY",j="ANY"), + function(x,i, ...){ + if(is.matrix(i)){ + out <- sparsetable_accessor(index(x),values(x), i) + } else { + out <- sparsetable_accessor(index(x),values(x), matrix(c(i,j,unlist(list(...))),nrow=1)) + } + return(out) + } ) + +setMethod("[",signature(x="sparsetable",i="disord",j="missing"), + function(x,i){ + sparsetable(index(x)[i,,drop=FALSE],values(x)[i]) # the meat + } ) + +setMethod("[",signature(x="sparsetable",i="disindex",j="missing"), + function(x,i,j){ + vx <- frab::values(x) + vi <- disordR::values(i) + sparsetable(index(x)[vi,,drop=FALSE], vx[i]) # the meat + } ) + +setReplaceMethod("[",signature(x="sparsetable",i="disord",j="missing",value="numeric"), + function(x,i,j,value){ + v <- values(x) + stopifnot(consistent(v,i)) + v[i] <- value # the meat + sparsetable(index(x),v) + } ) + +setReplaceMethod("[",signature(x="sparsetable",i="disindex",j="missing",value="ANY"), + function(x,i,j,...,value){ + stopifnot(identical(hash(values(x)),hash(i))) + if(is.disord(value)){stop("replace methods for disindex do not take disords")} + jj <- values(x) + jj[disordR::values(i)] <- value # the meat + return(sparsetable(index(x),jj)) + } ) + +setReplaceMethod("[",signature(x="sparsetable",value="ANY"), + function(x,i,j,...,value){ + if(missing(i)){ # S[] <- something + if(is.sparsetable(value)){ + return( + as.sparsetable(sparsetable_overwrite( + index(x ),values(x ), + index(value),values(value)))) + } else { + stop("replacement method not defined (disord discipline violation?)") + ## return(sparsetable(index(x),value)) + } + } + + if(is.matrix(i)){ + M <- i + } else if(is.sparsetable(i)){ + warning("possible disord discipline violation") + M <- index(i) + } else { + if(missing(j)){j <- NULL} + M <- as.matrix(expand.grid(c(list(i), j, list(...)))) + } + if(ncol(M) != arity(x)){ + stop("incorrect number of dimensions specified") + } + + if(length(value)==1){value <- rep(value,nrow(M))} + stopifnot(length(value)==nrow(M)) + return(as.sparsetable(sparsetable_setter(index(x),values(x),M,value))) + } + ) + +setMethod("drop","sparsetable",function(x){frab(setNames(disordR::elements(values(x)),c(index(x))))}) + +`pmax_pair_sparsetable` <- function(F1,F2){ + as.sparsetable(sparsetable_pmax( + index(F1),elements(values(F1)), + index(F2),elements(values(F2)) + )) +} + +`pmin_pair_sparsetable` <- function(F1,F2){ + -pmax_pair_sparsetable(-F1,-F2)} + +`pmax_dots_sparsetable` <- function(x,...){ + if(nargs()==1){ + return(x) + } else if(nargs()<3){ + return(pmax_pair_sparsetable(x, ...)) + } else { + return(pmax_pair_sparsetable(x, pmax_dots_sparsetable(...))) + } +} + +`pmin_dots_sparsetable` <- function(x,...){ + if(nargs()==1){ + return(x) + } else if(nargs()<3){ + return(pmin_pair_sparsetable(x, ...)) + } else { + return(pmin_pair_sparsetable(x, pmin_dots_sparsetable(...))) + } +} + +setMethod("pmax",signature("..."="sparsetable"), function(...){pmax_dots_sparsetable(...)} ) +setMethod("pmin",signature("..."="sparsetable"), function(...){pmin_dots_sparsetable(...)} ) + +setGeneric("asum",function(S,dims){standardGeneric("asum")}) +setMethod("asum",signature(S="sparsetable"), function(S,dims){asum_sparsetable(S,dims)}) + +`asum_sparsetable` <- function(S, dims){ + if(is.character(dims)){ + dims <- which(dimnames(S) %in% dims) + } else { + if(is.logical(dims)){ dims <- which(dims) } + stopifnot(all(dims <= arity(S))) + stopifnot(all(dims >0)) + stopifnot(all(dims == round(dims))) + } + jj <- sparsetable_asum_include(index(S),elements(values(S)),dims) + I <- jj$index[,-dims,drop=FALSE] + colnames(I) <- dimnames(S)[-dims] + return(sparsetable(I,jj$value)) +} + +`asum_exclude_sparsetable` <- function(S,dims){ + if(is.character(dims)){ + dims <- which(!(dimnames(S) %in% dims)) + } else if(is.logical(dims)){ + dims <- !dims + } else { + dims <- which(!(seq_len(arity(S)) %in% dims)) + } + return(asum_sparsetable(S, dims)) +} diff --git a/README.md b/README.md index 51cf093..85ab639 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -The frab package: an alternative interpretation of named vectors +The frab package: how to add tables ================ @@ -7,21 +7,30 @@ The frab package: an alternative interpretation of named vectors # Overview -The `frab` package furnishes an alternative interpretation of named -vectors wherein addition is defined using the (unique) names as the -primary key. This allows one to “add” tables in a consistent and -meaningful way. The underlying mathematical object is the Free Abelian -group. +The `frab` package allows one to “add” tables in a natural way. It also +furnishes an alternative interpretation of named vectors wherein +addition is defined using the (unique) names as the primary key. Support +for multi-dimensional tables is included. The underlying mathematical +object is the Free Abelian group. To cite in publications please use R. +K. S. Hankin 2023. “The free Abelian group in R: the frab package”, +arXiv, . + +The package has two S4 classes: `frab` and `sparsetable`. Class `frab` +is for one-dimensional tables and is an alternative implementation of +named vectors; class `sparsetable` handles multi-way tables in a natural +way. # The package in use -The package has a single S4 class of objects, `frab`. Primary -construction function `frab()` takes a named vector and returns a `frab` -object: +## One-dimensional tables: class `frab` + +Primary construction function `frab()` takes a named vector and returns +a `frab` object: ``` r suppressMessages(library("frab")) -frab(c(x=1,b=2,a=2,b=3,c=7,x=-1)) +p <- c(x=1,b=2,a=2,b=3,c=7,x=-1) +frab(p) #> A frab object with entries #> a b c #> 2 5 7 @@ -31,8 +40,20 @@ Above, we see from the return value that function `frab()` has reordered the labels of its argument, calculated the value for entry `b` \[as ![2+3=5](https://latex.codecogs.com/png.latex?2%2B3%3D5 "2+3=5")\], determined that the entry for `x` has vanished \[the values cancelling -out\], and printed the result using a bespoke show method. However, the -package’s most useful feature is the overloaded definition of addition: +out\], and printed the result using a bespoke show method. It is useful +to think of the input argument as a semi-constructed and generalized +“table” of observations. Thus + +``` r +p +#> x b a b c x +#> 1 2 2 3 7 -1 +``` + +Above we see `p` might correspond to a story: “look, we have one `x`, +two `b`s, two `a`s, another three `b`s, seven `c`s…oh hang on that `x` +was a mistake I had better subtract one now”. However, the package’s +most useful feature is the overloaded definition of addition: ``` r (x <- rfrab()) @@ -49,8 +70,170 @@ x+y #> 7 10 2 6 8 5 7 7 ``` +Above we see function `rfrab()` used to generate a random `frab` object, +corresponding to a table. It is *possible* to add `x` and `y` directly: + +``` r +xn <- as.namedvector(x) +yn <- as.namedvector(y) +table(c(rep(names(xn),times=xn),rep(names(yn),times=yn))) +#> +#> a b c d e f g i +#> 7 10 2 6 8 5 7 7 +``` + +but this is extremely inefficient and cannot deal with fractional (or +indeed negative) entries. + +# Multi-way tables + +Class `sparsetable` deals with multi-way tables. Taking three-way tables +as an example: + +``` r +(x3 <- rspar()) +#> Jan Feb Mar val +#> a a a = 10 +#> a c b = 15 +#> b a a = 11 +#> b a b = 9 +#> b a c = 12 +#> b b a = 6 +#> b b b = 3 +#> b b c = 14 +#> b c a = 9 +#> b c c = 21 +#> c c a = 10 +``` + +Function `rspar()` returns a random `sparsetable` object. We see that, +of the +![3^3=27](https://latex.codecogs.com/png.latex?3%5E3%3D27 "3^3=27") +possible entries, only 11 are non-zero. We may coerce to a regular +table: + +``` r +as.array(x3) +#> , , Mar = a +#> +#> Feb +#> Jan a b c +#> a 10 0 0 +#> b 11 6 9 +#> c 0 0 10 +#> +#> , , Mar = b +#> +#> Feb +#> Jan a b c +#> a 0 0 15 +#> b 9 3 0 +#> c 0 0 0 +#> +#> , , Mar = c +#> +#> Feb +#> Jan a b c +#> a 0 0 0 +#> b 12 14 21 +#> c 0 0 0 +``` + +In this case it is hardly worth taking advantage of the sparse +representation (which is largely inherited from the `spray` package) but +a larger example might be + +``` r +rspar(n=4,l=10,d=12) +#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec val +#> b c j e f j f a g i a d = 1 +#> g a j e c f e c a f g c = 4 +#> j b j g h c d c c b b i = 2 +#> j j h h a a i f c h g h = 3 +``` + +The random `sparsetable` object shown above would require +![10^{12}](https://latex.codecogs.com/png.latex?10%5E%7B12%7D "10^{12}") +floating point numbers in full array form, of which only 4 are nonzero. +Multi-way tables may be added in the same way as `frab` objects: + +``` r +y3 <- rspar() +x3+y3 +#> Jan Feb Mar val +#> a a a = 10 +#> a a b = 14 +#> a b a = 4 +#> a c a = 14 +#> a c b = 15 +#> b a a = 11 +#> b a b = 23 +#> b a c = 12 +#> b b a = 17 +#> b b b = 13 +#> b b c = 23 +#> b c a = 9 +#> b c b = 7 +#> b c c = 24 +#> c a a = 15 +#> c c a = 15 +#> c c c = 14 +``` + +## Two-way tables + +Two-way tables are something of a special case, having their own print +method. By default, two-dimensional `sparsetable` objects are coerced to +a matrix before printing, but otherwise operate in the same way as the +multi-dimensional case discussed above: + +``` r +(x2 <- rspar2()) +#> bar +#> foo A B D E F +#> a 3 20 0 0 9 +#> b 0 0 15 0 0 +#> c 0 0 0 4 0 +#> d 0 0 0 5 22 +#> e 0 2 0 11 29 +(y2 <- rspar2()) +#> bar +#> foo A C D E F +#> a 9 0 25 6 10 +#> b 7 0 0 0 1 +#> c 0 0 0 11 0 +#> d 8 5 0 4 0 +#> e 0 3 2 0 0 +#> f 0 0 14 0 15 +x2+y2 +#> bar +#> foo A B C D E F +#> a 12 20 0 25 6 19 +#> b 7 0 0 15 0 1 +#> c 0 0 0 0 15 0 +#> d 8 0 5 0 9 22 +#> e 0 2 3 2 11 29 +#> f 0 0 0 14 0 15 +``` + +Above, note how the sizes of the coerced matrices are different +(![5\times 5](https://latex.codecogs.com/png.latex?5%5Ctimes%205 "5\times 5") +for `x2`, +![6\times 5](https://latex.codecogs.com/png.latex?6%5Ctimes%205 "6\times 5") +for `y2`) but the addition method copes, using a bespoke sparse matrix +representation. Also note that the sum has *six* columns (corresponding +to six distinct column headings) even though `x2` and `y2` have only +five. + # Further information For more detail, see the package vignette `vignette("frab")` + +## References + +- R. K. S. Hankin 2023. “The free Abelian group in `R`: the `frab` + package”, arXiv, . +- R. K. S. Hankin 2022. “Disordered vectors in `R`: introducing the + `disordR` package”, arXiv, diff --git a/build/frab.pdf b/build/frab.pdf index 3e797cddd1cd26825cf1be958422bc8dcc9c92a2..6547f8e7ae84b097a171e7280eb9aff8e4dc7b32 100644 GIT binary patch delta 123611 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%0DPW5a{-E3&xo9LR>^3oC8vLy6G+%p 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

wF=`V!SGKG9Uz&%@|Dk=xoN%!aPJSJ0D*5_ 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

mr&DU`t>*{9NoPLqG2P9 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

*i`_$B8` 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Ⓢo-AyobQKy7D8gZ2Z)^ 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 B#k~Lk literal 4330 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 XNVi~QBCkTQ(Zc@&&5O`5Xutpf8-Lv) literal 6045 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 N1^{=e`^&EZ001xzST+Cv diff --git a/inst/doc/frab.R b/inst/doc/frab.R index 3d1eda8..e28c5ac 100644 --- a/inst/doc/frab.R +++ b/inst/doc/frab.R @@ -2,6 +2,7 @@ knitr::opts_chunk$set(echo = TRUE) options(rmarkdown.html_vignette.check_title = FALSE) library("frab") +library("mvtnorm") set.seed(1) ## ----label=badtables---------------------------------------------------------- @@ -48,3 +49,22 @@ a b a+b +## ----label=twodeetables------------------------------------------------------- +(x <- rspar2(9)) +(y <- rspar2(9)) +x+y + +## ----label=threedeetables----------------------------------------------------- +A <- matrix(0.95,3,3) +diag(A) <- 1 +x <- round(rmvnorm(300,mean=rep(10,3),sigma=A/7)) +x[] <- letters[x] +head(x) +(sx <- sparsetable(x)) + +## ----label=showthreedeeadd---------------------------------------------------- +(sz <- sparsetable(matrix(sample(letters[9:11],12,replace=TRUE),ncol=3),1001:1004)) + +## ----label=usualsemantics----------------------------------------------------- +sx + sz + diff --git a/inst/doc/frab.Rmd b/inst/doc/frab.Rmd index 75a9a46..49e693f 100644 --- a/inst/doc/frab.Rmd +++ b/inst/doc/frab.Rmd @@ -1,5 +1,5 @@ --- -title: "An alternative implementation of named vectors: addition of `table`s with the `frab` package" +title: "Addition of `table` objects with the `frab` package" author: "Robin K. S. Hankin" output: html_vignette bibliography: frab.bib @@ -9,11 +9,11 @@ vignette: > %\VignetteEncoding{UTF-8} --- - ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) options(rmarkdown.html_vignette.check_title = FALSE) library("frab") +library("mvtnorm") set.seed(1) ``` @@ -24,8 +24,10 @@ set.seed(1) **TLDR**: Adding two objects of class `table` has a natural interpretation. However, in base R, adding two tables can give plausible but incorrect results. The `frab` package provides a -consistent and efficient way to add `table` objects. The underlying -mathematical structure is the Free Abelian group, hence "`frab`". +consistent and efficient way to add `table` objects, subject to +`disordR` discipline [@hankin2022_disordR]. The underlying +mathematical structure is the Free Abelian group, hence "`frab`". To +cite in publications, please use [@hankin2023_frab]. # Prologue: `table()` @@ -150,9 +152,48 @@ Above we see the `+` operator is defined between a `frab` and a `table`, coercing tables to `frab` objects to give consistent results. -Carefully regulated ambiguity +# Two dimensional tables + +The ideas above have a natural generalization to two-dimensional tables. + +```{r,label=twodeetables} +(x <- rspar2(9)) +(y <- rspar2(9)) +x+y +``` + +Above, note that the resulting sum is automatically resized to +accommodate both addends, and also that entries with nonzero values in +both `x` and `y` are correctly summed. + + +## Arbitrary-dimensioned tables +The one- and two- dimensional tables above have somewhat specialized +print methods and the general case with dimension $\geqslant 3$ uses +methods similar to those of the `spray` package. We can generate a +`sparsetable` object quite easily: +```{r label=threedeetables} +A <- matrix(0.95,3,3) +diag(A) <- 1 +x <- round(rmvnorm(300,mean=rep(10,3),sigma=A/7)) +x[] <- letters[x] +head(x) +(sx <- sparsetable(x)) +``` + +But we can add `sx` to other `sparsetable` objects: + +```{r label=showthreedeeadd} +(sz <- sparsetable(matrix(sample(letters[9:11],12,replace=TRUE),ncol=3),1001:1004)) +``` + +Then the usual semantics for addition operate: + +```{r label=usualsemantics} +sx + sz +``` ## References diff --git a/inst/doc/frab.html b/inst/doc/frab.html index 26eeade..c7ed70a 100644 --- a/inst/doc/frab.html +++ b/inst/doc/frab.html @@ -13,7 +13,7 @@ -An alternative implementation of named vectors: addition of tables with the frab package +Addition of table objects with the frab package @@ -168,7 +168,7 @@ -

An alternative implementation of named vectors: addition of tables with the frab package

+

Addition of table objects with the frab package

Robin K. S. Hankin

@@ -176,7 +176,7 @@

Robin K. S. Hankin

-

TLDR: Adding two objects of class table has a natural interpretation. However, in base R, adding two tables can give plausible but incorrect results. The frab package provides a consistent and efficient way to add table objects. The underlying mathematical structure is the Free Abelian group, hence “frab.”

+

TLDR: Adding two objects of class table has a natural interpretation. However, in base R, adding two tables can give plausible but incorrect results. The frab package provides a consistent and efficient way to add table objects, subject to disordR discipline (Hankin 2022). The underlying mathematical structure is the Free Abelian group, hence “frab.” To cite in publications, please use (Hankin 2023).

Prologue: table()

Suppose we have three tables:

@@ -282,12 +282,99 @@

The frab package

## a b c d e f g i ## 5 8 2 7 2 2 8 5

Above we see the + operator is defined between a frab and a table, coercing tables to frab objects to give consistent results.

-

Carefully regulated ambiguity

+
+
+

Two dimensional tables

+

The ideas above have a natural generalization to two-dimensional tables.

+
(x <- rspar2(9))
+
##    bar
+## foo A  B C D F
+##   b 3  0 8 0 2
+##   d 5 16 0 0 6
+##   f 1  0 0 4 0
+
(y <- rspar2(9))
+
##    bar
+## foo A C D E F
+##   a 0 0 0 9 0
+##   b 0 0 0 0 8
+##   e 0 0 4 0 0
+##   f 7 9 8 0 0
+
x+y
+
##    bar
+## foo A  B C  D E  F
+##   a 0  0 0  0 9  0
+##   b 3  0 8  0 0 10
+##   d 5 16 0  0 0  6
+##   e 0  0 0  4 0  0
+##   f 8  0 9 12 0  0
+

Above, note that the resulting sum is automatically resized to accommodate both addends, and also that entries with nonzero values in both x and y are correctly summed.

+
+

Arbitrary-dimensioned tables

+

The one- and two- dimensional tables above have somewhat specialized print methods and the general case with dimension \(\geqslant 3\) uses methods similar to those of the spray package. We can generate a sparsetable object quite easily:

+
A <- matrix(0.95,3,3)
+diag(A) <- 1
+x <- round(rmvnorm(300,mean=rep(10,3),sigma=A/7))
+x[] <- letters[x]
+head(x)
+
##      [,1] [,2] [,3]
+## [1,] "i"  "i"  "i" 
+## [2,] "j"  "j"  "j" 
+## [3,] "j"  "j"  "k" 
+## [4,] "j"  "j"  "j" 
+## [5,] "j"  "j"  "i" 
+## [6,] "j"  "j"  "j"
+
(sx  <- sparsetable(x))
+
##            val
+##  i i i  =   22
+##  i i j  =    2
+##  i j i  =    5
+##  i j j  =    4
+##  j i i  =    2
+##  j i j  =    1
+##  j j i  =    3
+##  j j j  =  223
+##  j j k  =    7
+##  j k j  =    3
+##  j k k  =    1
+##  k j j  =    2
+##  k j k  =    4
+##  k k j  =    1
+##  k k k  =   20
+

But we can add sx to other sparsetable objects:

+
(sz <- sparsetable(matrix(sample(letters[9:11],12,replace=TRUE),ncol=3),1001:1004))
+
##             val
+##  i k k  =  1003
+##  j j j  =  1004
+##  j j k  =  1001
+##  k k j  =  1002
+

Then the usual semantics for addition operate:

+
sx + sz
+
##             val
+##  i i i  =    22
+##  i i j  =     2
+##  i j i  =     5
+##  i j j  =     4
+##  i k k  =  1003
+##  j i i  =     2
+##  j i j  =     1
+##  j j i  =     3
+##  j j j  =  1227
+##  j j k  =  1008
+##  j k j  =     3
+##  j k k  =     1
+##  k j j  =     2
+##  k j k  =     4
+##  k k j  =  1003
+##  k k k  =    20
+

References

-Hankin, Robin K. S. 2022. “Disordered Vectors in R: Introducing the disordR Package.” arXiv. https://doi.org/10.48550/ARXIV.2210.03856. +Hankin, Robin K. S. 2022. “Disordered Vectors in R: Introducing the disordR Package.” arXiv. https://doi.org/10.48550/ARXIV.2210.03856. +
+
+———. 2023. “The Free Abelian Group in R: The frab Package.” arXiv. https://doi.org/10.48550/ARXIV.2307.13184.
R Core Team. 2022. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/. diff --git a/inst/frab.bib b/inst/frab.bib new file mode 100644 index 0000000..408ad42 --- /dev/null +++ b/inst/frab.bib @@ -0,0 +1,38 @@ +@Manual{rcore2023, + title = {R: A Language and Environment for Statistical Computing}, + author = {{R Core Team}}, + organization = {R Foundation for Statistical Computing}, + address = {Vienna, Austria}, + year = {2023}, + url = {https://www.R-project.org/}, + } + +@Misc{hankin2022_spray, + title = {Sparse arrays in {R}: the {{\tt spray}} package}, + url = {https://arxiv.org/abs/2210.10848}, + howpublished = {\url{https://arxiv.org/abs/2210.03856}}, + author = {Robin K. S. Hankin}, + year = {2022}, + publisher = {arXiv}, + doi = {10.48550/ARXIV.2210.10848}, + } + +@misc{hankin2022_disordR, + doi = {10.48550/ARXIV.2210.03856}, + howpublished = {\url{https://arxiv.org/abs/2210.03856}}, + author = {Hankin, Robin K. S.}, + title = {Disordered vectors in {R}: introducing the {{\tt disordR}} package}, + publisher = {arXiv}, + year = {2022} + } + +@misc{hankin2022_clifford, + doi = {10.48550/ARXIV.2209.13659}, + howpublished = {\url{https://arxiv.org/abs/2209.13659}}, + author = {Hankin, Robin K. S.}, + keywords = {Symbolic Computation (cs.SC), FOS: Computer and information sciences, FOS: Computer and information sciences}, + title = {Clifford algebra in {R}}, + publisher = {arXiv}, + year = {2022} + } + diff --git a/inst/frab_arxiv.Rnw b/inst/frab_arxiv.Rnw new file mode 100644 index 0000000..775cfcd --- /dev/null +++ b/inst/frab_arxiv.Rnw @@ -0,0 +1,1031 @@ +% -*- mode: noweb; noweb-default-code-mode: R-mode; -*- + + +\documentclass{article} + +\usepackage{arxiv} + +\usepackage[utf8]{inputenc} % allow utf-8 input +\usepackage[T1]{fontenc} % use 8-bit T1 fonts +\usepackage{hyperref} % hyperlinks +\usepackage{url} % simple URL typesetting +\usepackage{booktabs} % professional-quality tables +\usepackage{amsfonts} % blackboard math symbols +\usepackage{amssymb} % needed for \leqslant +\usepackage{amsmath} % needed for cases +\usepackage{nicefrac} % compact symbols for 1/2, etc. +\usepackage{microtype} % microtypography +\usepackage{lipsum} % Can be removed after putting your text content +\usepackage{graphicx} +\usepackage[numbers]{natbib} +\usepackage{doi} +\usepackage{wrapfig} +\usepackage{tikz-cd} +\usepackage{xcolor} + +\title{Adding tables with the free Abelian group in R: introducing the {\tt frab} package} + +%\date{September 9, 1985} % Here you can change the date presented in the paper title +%\date{} % Or removing it + +\author{ \href{https://orcid.org/0000-0001-5982-0415}{\includegraphics[width=0.03\textwidth]{orcid.pdf}\hspace{1mm}Robin K. S.~Hankin}\thanks{\href{https://academics.aut.ac.nz/robin.hankin}{work}; +\href{https://www.youtube.com/watch?v=JzCX3FqDIOc&list=PL9_n3Tqzq9iWtgD8POJFdnVUCZ_zw6OiB&ab_channel=TrinTragulaGeneralRelativity}{play}} \\ + Auckland University of Technology\\ + \texttt{hankin.robin@gmail.com} \\ +} + +% Uncomment to remove the date +%\date{} + +% Uncomment to override the `A preprint' in the header +%\renewcommand{\headeright}{Technical Report} +%\renewcommand{\undertitle}{Technical Report} + + +%%% Add PDF metadata to help others organize their library +%%% Once the PDF is generated, you can check the metadata with +%%% $ pdfinfo template.pdf +\hypersetup{ +pdftitle={The free Abelian group in R}, +pdfsubject={q-bio.NC, q-bio.QM}, +pdfauthor={Robin K. S.~Hankin}, +pdfkeywords={The free Abelian group, named vectors} +} + +\begin{document} +\maketitle + +\setlength{\intextsep}{0pt} +\begin{wrapfigure}{r}{0.2\textwidth} + \begin{center} +\includegraphics[width=1in]{frab.png} + \end{center} +\end{wrapfigure} + + +\begin{abstract} + + In this short article I introduce the {\tt frab} package which + provides an alternative interpretation of named vectors in the R + programming language; it is available on CRAN at\\ + \url{https://CRAN.R-project.org/package=frab}. The underlying + mathematical object is the free Abelian group. + +\end{abstract} + +\SweaveOpts{} + + +\section{Introduction} + +The {\bf Free Abelian Group} is a direct sum of infinite cyclic +groups. If these cyclic goups are generated by $\left\lbrace +x_i\colon i\in\mathcal{I}\right\rbrace$ for some (finite) index set +$\mathcal{I}$, then the Free Abelian group $F$ will be + +$$F=\bigoplus_{i\in\mathcal{I}}\left\langle x_i\right\rangle.$$ + +From now on we assume that $\left|\mathcal{I}\right| =k < \infty$; +thus the elements of $F$ will be of the form + +\begin{equation}\label{formal_form} +g=n_1x_1+n_2x_2+\cdots+n_kx_k +\end{equation} + +where $k_i\in\mathbb{Z}$, $1\leqslant i\leqslant k$. The group +operation (conventionally one uses additive notation) is then defined +by componentwise addition: + +$$g=n_1x_1+n_2x_2+\cdots+n_kx_k$$ +$$h=r_1x_1+r_2x_2+\cdots+r_kx_k$$ + +$$h+g=(n_1+r_1)x_1+(n_2+r_2)x_2+\cdots+(n_k+r_k)x_k$$ + +One can define $F$ formally by starting with a generating set +$X=\left\lbrace x_1,\ldots,x_k\right\rbrace$ of symbols and defining +$F$ as the set of all formal expressions of the form~\ref{formal_form} +under addition as defined above. + +The Free Abelian group is an interesting and useful mathematical +object. Here I show how it may be implemented in the R programming +language \citep{rcore2023}. I also show how a slight natural +generalization (which is convenient in the context of numerical +techniques), may be incorporated. + +\section{Package internals} + +The package uses the {\tt STL map} class for efficiency. This class +maps strings (symbols) to doubles; the declaration + +\begin{verbatim} +typedef std::map frab; +\end{verbatim} + +appears in the {\tt src/} package directory. Such maps are limited +only by memory availability. + +\section{The {\tt frab} package in use} + +The {\tt frab} package associates a numerical value with each of a set +of arbitrary (character string) symbols. This is accomplished using +the {\tt STL} {\tt map} class, a container that stores key-value pairs +and allows fast lookup and insertion based on the key. Here we have +keys as character strings and values are double-precision numbers. + +To use the package, it must first be installed and loaded: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +install.packages("frab") +<>= +library("frab") +set.seed(0) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Function {\tt install.packages()} downloads packages from CRAN +\item Function {\tt library()} loads packages to the current R session +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +The package uses a single S4 class, {\tt frab}, for which a variety of +methods is defined. There are several ways to create {\tt frab} +objects, but the most straightforward is to coerce a named vector +using the {\tt frab()} function: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +frab(c(z=2,y=7,x=1)) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Function {\tt frab()} takes a named vector as its single argument +\item It returns an object of class {\tt frab} +\item The elements of the returned {\tt frab} object are reordered; they +appear in an implementation-specific order +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Above, see how {\tt frab()} takes a named numeric vector and returns +an object of class {\tt frab}. It takes the names of its argument, +possibly reordering them, and returns a {\tt frab} object. Function +{\tt frab()} considers the names of the elements to be the primary +extraction and replacement mechanism. If the argument has repeated +names, function {\tt frab()} sums them: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +frab(c(t=3,q=2,t=4,q=-1,p=6,a=3,t=5)) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Function {\tt frab()} coerces its argument, a named +vector, to an object of class {\tt frab} +\item Element {\tt t} and {\tt t} are summed, with values $3+5=8$ and +$3+4+5=12$ respectively +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Above we see that the entries for {\tt t} and {\tt q} are summed. +Zero entries are discarded: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +frab(c(pear=1,kiwi=0,fig=3,lime=2,fig=-3)) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Function {\tt frab()} coerces its argument, a named +vector, to an object of class {\tt frab} +\item Element {\tt kiwi} is discarded, having a zero value +\item Element {\tt fig} vanishes, its entries cancelling +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Above we see that zero entries are discarded, irrespective of whether +a zero is explicitly given, or repeated values cancel. However, the +main motivation for using {\tt frab} objects is that they may be +added: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +a <- frab(c(x=2,y=1,z=3)) +b <- frab(c(y=3,x=3,u=1)) +a+b +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt a} and {\tt b} are of class {\tt frab} +\item Their sum is defined in terms of the keys of the summands, not +position +\item Thus, {\tt a+b} has 5 ($=2+3$) for its {\tt x} entry and 4 +($=1+3$) for its {\tt y} entry +\item {\tt a+b} has its entries in implementation-specific order, as per + {\tt disordR} discipline +\item Also, note that {\tt a+b} has length +4, while {\tt a} and {\tt b} have length 3 +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +\section{Extensions of {\tt frab} objects to floating-point values} + +The {\tt frab} class is sufficiently flexible to incorporate +floating-point values, although one has to be a little careful with +numerical round-off errors: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x <- frab(c(a=4,u=pi,p=exp(pi))) +y <- frab(c(p=-exp(pi)/3,u=-pi)) +z <- frab(c(p=-exp(pi)*2/3)) +x+y+z +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt x}, {\tt y} and {\tt z} are of class {\tt frab} +\item Their sum {\tt x+y+z} should have zero entries for {\tt u} and {\tt p} +\item We see the entry for {\tt u} vanishes\ldots +\item \ldots But the entry for {\tt p} is nonzero, being subject to (small) + numerical roundoff error +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + + +\section{The {\tt frab} package and {\tt disordR} discipline} + +The {\tt frab} package conforms to disord +discipline~\cite{hankin2022_disordR}. Here I present some discussion +of the motivation for this design decision. Consider the following +short R session: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +\begin{Schunk} +\begin{Sinput} +(a <- frab(c(x=2,y=1,u=8,z=3,v=5))) +\end{Sinput} +\begin{Soutput} +A frab object with entries +u v x y z +8 5 2 1 3 +\end{Soutput} +\begin{Sinput} +> a["x"] +\end{Sinput} +\begin{Soutput} +A frab object with entries +x +2 +\end{Soutput} +\begin{Sinput} +> a[1] +\end{Sinput} +\begin{Soutput} +Error in .local(x, i, j = j, ..., drop): + not implemented +> +\end{Soutput} +\end{Schunk} +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt a} is a map from symbols to numeric values +\item The {\tt STL map} class stores value-key pairs in an undefined order +\item Thus, extracting the value for {\tt "x"} is fine, but because the order is not +defind it makes no sense to extract the ``first" element +\item And attempting to do so results in a disord discipline error +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Observe that we cannot dispense with order of the values entirely, +because sometimes I am interested in the vector of keys, or their +values, in isolation. If we want to work with the names or values of +a {\tt frab} object, then the {\tt disord} print methods are used: + +<>= +a <- frab(c(x=2,y=1,z=3)) +names(a) +values(a) +@ + +Above we see that {\tt names(a)} and {\tt values(a)} return {\tt +disord} objects, in this case with the same hash code which indicates +that the objects are consistent with one another in the sense of {\tt +disordR::consitent()}. These objects may be displayed and +subsequently manipulated, subject to disord discipline: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(a <- frab(c(x=2,y=1,z=3))) +names(a) <- toupper(names(a)) +a +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item {\tt a} is a {\tt frab} object +\item {\tt names(a)} is a {\tt disord} object as above +\item Replacement methods are defined, in this case {\tt toupper()} + returns a {\tt disord} object +\item The names of {\tt a} become their uppercase equivalents +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Again observe that there is no meaning to the operation ``extract the +first element of {\tt names(a)}", because the elements of {\tt +names(a)}, being a {\tt disord} object, are stored in an +implementation-specific order. We may manipulate the values of a {\tt +frab} object, if we are careful to be consistent with disord +discipline. The package includes a number of convenient replacement +idioms: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(a <- frab(c(x=2,y=-1,z=3,p=-4,u=20))) +values(a) <- values(a)^2 +a +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item {\tt a} is a {\tt frab} object +\item We square the {\tt values()} of {\tt a} using the replacement method +\item And object {\tt a} is altered appropriately +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Further, we may use the {\tt disindex} class of the {\tt disordR} +package to replace certain values using standard square bracket +replacement idiom: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(a <- frab(c(x=2,y=-1,z=11,p=-4,u=20))) +a[a>10] <- 19 +a +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item {\tt a} is a {\tt frab} object +\item We set any value exceeding 10 to 19 +\item And object {\tt a} is altered appropriately +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + + + +\section{Higher-dimensional tables} + +The ideas above have a natural generalization to multi-dimensional +tables. The {\tt frab} package {\tt S4} class is {\tt sparsetable}, +and this has arithmetic methods implemented. We start with +three-dimensional tables (two-dimensional {\tt sparstable} objects +have a print method that coerces them to arrays before displaying, and +the general case is easier to understand). + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +abcd <- letters[1:4] +jj <- sample(abcd,99,repl=T,prob=1/(1:4)^2) +I <- matrix(jj,33,3) +head(I) +nrow(I) +(x <- sparsetable(I)) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt abc} is just {\tt c("a","b","c")}, defined to save +horizontal space +\vspace{30mm} +\item Random matrix {\tt I} has elements a-d +\item It has 33 rows +\item Coercing {\tt I} to {\tt sparsetable} object {\tt x} shows the counts +of each type of row. +\item Object {\tt x} has 13 rows; not all $4^3=64$ possible row types +are represented. +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] +@ + +Standard extraction and replacement operations work as expected on {\tt sparsetable} object {\tt x}: + + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x["a","a","b"] +x[rbind(c("a","b","b"),c("a","b","c"))] +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Extraction can operate with the arguments sent separately\ldots +\vspace{3mm} +\item Or as a matrix. +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] +@ + + +However, other more specialised extraction methods are also provided: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x[x>3] +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Extraction can operate with a disord object +\item Here we extract every element greater than 3 +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] +@ + +Replacement methods are also defined: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x[x==1] <- 0 +x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Replacement can operate with a disord object +\item Here we replace each element equal to 1 with zero +\item Only elements $>1$ remain +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] +@ + +Replacement methods can add new entries if needed: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x["a","x","y"] <- 1000 +x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item The replacement operator can create new entries +\item Here we create a new entry corresponding to {\tt a x y} with value $1000$ +\item The new entry is placed in its own implementation-specific +location, as per {\tt disordR} discipline +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] +@ + + +\section{Two dimensional tables} + +If a {\tt sparsetable} object has arity 2, it is coerced to matrix +form before printing. Otherwise, the semantics are the same as for +any other {\tt sparsetable} object. + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(x <- rspar2(9)) +(y <- rspar2(9)) +x+y +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Function {\tt rspar()} gives a random 2D sparse table +\vspace{25mm} +\item {\tt x} and {\tt y} are random {\tt sparsetable} objects +\vspace{20mm} +\item Package idiom allows sparse tables to be added even if the tables are different sizes +\item The resulting sum is automatically resized to accommodate both +addends +\item Entries with nonzero values in both {\tt x} and {\tt y} +are correctly summed +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] +@ + + + +\appendix +\section{Appendix: Named vectors in R} + +A {\em named vector} is a vector with a names attribute; they are a +convenient and useful feature of the R programming language (R Core +Team 2022). Each element of a named vector is associated with a name +or label. Objects of the {\tt frab} class bears some resemblance to +named vectors. However, there are some profound differences: + +\subsection{Uniqueness of names} + +The names of a named vector are not necessarily unique, unlike those +of a {\tt frab} object. This has consequences for extraction and +replacement operations. Consider the following: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(x <- c(a=7,b=4,a=3)) +x["a"] +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt x} is a named vector with three elements. Both the +first and the third element are named {\tt "a"} +\item This is perfectly OK +\item Extracting element {\tt "a"} returns the {\em first} element +with this name (Technically, it returns a named numeric vector of +length 1) +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +(we note in passing that double square bracket extraction, as in {\tt +x[["a"]]}, returns the value of the first element with name {\tt a}. + +\subsection{Replacement methods for named vectors} + +Replacement methods for named vectors is also somewhat problematic: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(x <- c(b=7,a=4,b=3,c=5)) +x["a"] <- 100 +x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt x} is a named vector with four elements. Both the +first and the third element are named {\tt "a"} +\item Replacing the element {\tt "a"} with 100 behaves as expected: +the element with name {\tt "a"} is returned +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +This might lead one to believe that replacement of multiple elements +would behave as expected. But: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x <- c(b=7,a=4,b=3,c=5) +x["b"] <- 100 +x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt x} is as before +\item Replacing the elements (putatively) indexed with {\tt "b"} [of +which there are two] with {\tt 100} results in only one element +being replaced. +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +We may also use multiple names for the index in a replacement operation: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x <- c(a=7, b=4, a=3, c=5) +x[c("a","c")] <- c(100,101) +x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt x} is as before +\item Replacing the elements (putatively) indexed with {\tt +c("a","c")} with {\tt c(100,101)} replaces the first (but not the +second) of the {\tt "a"} elements, and the {\tt "c"} element, with the +replacement value +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +\subsection{Addition of named vectors} + +Named vectors obey the usual algebraic relations for vectors, although +the details can be unexpected. Firstly, if nontrivial recycling rules +are applied, the result retains only the names of the longer of the +two addends: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +(x <- c(a=7, b=4, a=3, c=5)) +x + c(uu=100) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Object {\tt x} is a standard named vector +\item Adding {\tt c(uu=100)} [a named vector of length 1] to {\tt x} changes the values but not the names of the result +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Now with {\tt x} and {\tt y} named vectors of the same length, there +are at least three plausible values that it might give, viz: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x <- c(a=5,b=3,c=4) +y <- c(b=4,c=2,a=3) +plausible1 <- c(a=9,b=5,c=7) +plausible2 <- c(b=9,c=5,a=7) +plausible1 <- c(a=8,b=7,c=6) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt x} and {\tt y} are standard named vectors +\item Three plausible results: {\tt p1 p2 p3} +\item {\tt p1} adds elementwise and assigns names of {\tt x} +\item {\tt p2} adds elementwise and assigns names of {\tt y} +\item {\tt p3} adds namewise +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +A good case could be made for any of the plausible outcomes above. +However, in standard R idiom, adding two named vectors is equivalent +to stripping the names attribute, performing the addition, then +inserting the names as appropriate. If the two addends are of equal +length, the names of the first one is given the the result: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x <- c(a=1,b=2,c=3) +y <- c(c=4,b=1,a=1) +x+y +y+x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt x} and {\tt y} are standard named vectors +\item {\tt x+y} and {\tt y+x} have the same values but different names +\item {\tt x+y} inherits the names of {\tt x} +\item {\tt y+x} inherits the names of {\tt y} +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +If the addends are of incompatible length, a warning is given: + + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +\begin{Schunk} +\begin{Sinput} +> x <- c(a=1,b=2,c=3) +> y <- c(c=4,b=1,a=1,p=4) +> x+y +\end{Sinput} +\begin{Soutput} +c b a p +5 3 4 5 +Warning message: +In x + y : longer object length is not a + multiple of shorter object length +> +\end{Soutput} +\end{Schunk} +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt x} and {\tt y} are standard named vectors +\item {\tt x+y} is calculated using standard recycling rules +\item A warning (and optionally an error) is given +\item Names are inherited from the longer of the two addends, here {\tt y} +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + + +\section{Tables in R} + +Objects of class {\tt table} are created by function {\tt +table::base()}. Their behaviour is discussed here. Suppose we have +three tables: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +xl <- c("a","a","b","c","d","d","a") +yl <- c("a","a","b","d","d","d","e") +zl <- c("a","a","b","d","d","e","f") +x <- table(xl) +y <- table(yl) +z <- table(zl) +x +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt xl yl zl} are character vectors +\item They may be tabulated using {\tt table()} +\item Object {\tt x} is of class {\tt table} +\item Its entries are in alphabetical order +\item The internal structure of {\tt x} is that of an array with named dimensions +\item Objects {\tt y} and {\tt z} are similar +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +Can we ascribe any meaning to {\tt x+y}? We attempt standard R semantics: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x +y +x+y +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item The sum is defined here +\item No error or warning is given +\item The result is clearly incorrect: the entries for {\tt c,d,e} +should be $1+0=1$, $2+3=5$, and $0+1=1$ respectively +\item The result given by R is comparable to the result of adding named vectors +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + +The correct way to add such tables would be by concatenating their +respective data: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x +y +table(c(xl,yl)) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt xl,yl} are defined in the previous chunk +\item We may tabulate {\tt c(xl,yl)} +\item The resulting object in essence sums the named entries of the tables {\tt x,y} +\item For example, the entry for {\tt a} is $3+2=5$ +\item This is a reasonable interpretation of ``{\tt x+y}" +\item Note that the result is length 5, and that of each table is 4 +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + + +If we do not have access to {\tt xl} and {\tt yl} then the only way to +``add" {\tt x} and {\tt y} would be to reconstruct them: + +\vphantom{f}\\[2\baselineskip] +\begin{minipage}[t]{0.49\textwidth} +<>= +x +y +(xl_rec <- rep(names(x),times=x)) +(yl_rec <- rep(names(y),times=y)) +table(c(xl_rec,yl_rec)) +@ +\end{minipage} +\hfill +\vrule +\hfill +\begin{minipage}[t]{0.49\textwidth} +\vspace{-\baselineskip} +\color{violet} +\begin{itemize} +\item Objects {\tt x,y} are unchanged +\item We may reconstruct {\tt xl} by using {\tt base::rep(...)} with +the {\tt times} argument to form {\tt xl\_rec} +\item Similarly for {\tt yl} +\item And simply tabulate the concatentation {\tt c(xl\_rec,yl\_rec)} to ``add" {\tt x} and {\tt y} +\item The resulting table correctly sums the entries with regard to their labels +\end{itemize} +\color{black} +\end{minipage} +\vphantom{f}\\[2\baselineskip] + + +However, this is extremely inefficient, especially if the entries are +large. And indeed this method will not work for negative or +non-integral entries, although it is sufficiently robust to +accommodate zero entries consistently. + + +\bibliographystyle{apalike} +\bibliography{frab} + +\end{document} diff --git a/inst/read.me b/inst/read.me new file mode 100644 index 0000000..2466db4 --- /dev/null +++ b/inst/read.me @@ -0,0 +1,28 @@ +To create frab_arxiv.pdf, first use Sweave: + +R CMD Sweave frab_arxiv.Rnw + +this will create frab_arxiv.tex + +To process this with latex, you will need various auxiliary files such +as arxiv.sty and orcid.pdf. These are not under version control, you +will have to find these on the web. File frab.png (the hex sticker) +is in the man/figures directory. Copy these files to this directory, +inst/ + +There are two distinct versions of frab.bib, which use slightly +different markup. + + +Then to create frab_arxiv.pdf: + +pdflatex frab_arxiv +bibtex frab_arxiv +pdflatex frab_arxiv +pdflatex frab_arxiv + +should work. + + +For arxiv, upload frab_arxiv.tex which will be processed online. For +arxiv to process the file, you need to upload Sweave.sty as well. diff --git a/inst/wittgenstein.Rmd b/inst/wittgenstein.Rmd new file mode 100644 index 0000000..33e8a47 --- /dev/null +++ b/inst/wittgenstein.Rmd @@ -0,0 +1,42 @@ +--- +title: "That of which we cannot speak, we must remain silent" +author: "Robin Hankin" +date: "2023-07-25" +output: html_document +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` + +## Absent symbols and the `frab` package + +I do not really understand what Wittgenstein was trying to say in +proposition 7 of his _Tractatus_, but the interpretation of symbols +not present in a `frab` object is certainly an interesting problem. +Consider the canonical use-case for `frab` objects: + +```{r frabaplusb} +suppressMessages(library("frab")) +(a <- frab(c(u= -5,v=2,w=1))) +(b <- frab(c(v=1,x=2))) +a+b +``` + +Above we see that `a` has no `"x"` term, and `b` has `"x"=2`, the sum +being `"x"=2`; we are justified in asserting that, in object `b`, +`"x"=0`. However, consider this: + +```{r frabminus2} +(x <- frab(c(a=4, b=-3, c=1, d=-1, e=9))) +x[x > -2] +``` + +Above we extract every element greater than $-2$. We might say +"extract every element from `x` that is _known_ to exceed $-2$". It +has not extracted any absent symbols such as `f`, and as such we +cannot associate `f` with zero (because zero exceeds $-2$, and no `f` +element was extracted). But this is not consistent with the `a+b` +example above, in which absent symbols have the very definite and very +known value of zero. + diff --git a/man/Arith.Rd b/man/Arith.Rd index febf147..4dd8b5c 100644 --- a/man/Arith.Rd +++ b/man/Arith.Rd @@ -13,15 +13,18 @@ \alias{frab_negative} \alias{frab_reciprocal} \alias{frab_plus_frab} +\alias{frab_plus_numeric} +\alias{frab_multiply_frab} \alias{frab_unary} \alias{frab_arith_frab} \alias{frab_arith_numeric} \alias{numeric_arith_frab} \alias{c_frab_add} +\alias{c_frab_multiply} \alias{c_frab_eq} \alias{c_frab_pmax} \alias{c_frab_identity} -\title{Extraction and replacement methods for class \code{"frab"}} +\title{Arithmetic methods for class \code{"frab"}} \description{ The \code{frab} class provides basic arithmetic methods for frab @@ -38,10 +41,10 @@ frab_reciprocal(x) frab_plus_frab(F1,F2) frab_multiply_numeric(e1,e2) frab_power_numeric(e1,e2) -numeric_multiply_frab(e1,e2) numeric_power_frab(e1,e2) frab_unary(e1,e2) frab_arith_frab(e1,e2) +frab_plus_numeric(e1,e2) frab_arith_numeric(e1,e2) numeric_arith_frab(e1,e2) } @@ -64,10 +67,15 @@ numeric_arith_frab(e1,e2) \seealso{\code{\link{Compare}}} \examples{ -x <- frab(c(a=1,b=2,c=3)) -y <- frab(c(b=-2,d=8)) +(x <- frab(c(a=1,b=2,c=3))) +(y <- frab(c(b=-2,d=8,x=1,y=7))) +(z <- frab(c(c=2,x=5,b=1,a=6))) + x+y +x+y+z + +x*y } diff --git a/man/Compare.Rd b/man/Compare.Rd index f84c183..620d472 100644 --- a/man/Compare.Rd +++ b/man/Compare.Rd @@ -7,12 +7,14 @@ \alias{frab_eq} \alias{frab_compare_frab} \alias{frab_eq_num} +\alias{frab_ne_num} \alias{frab_gt_num} \alias{frab_ge_num} \alias{frab_lt_num} \alias{frab_le_num} \alias{frab_compare_numeric} \alias{num_eq_frab} +\alias{num_ne_frab} \alias{num_gt_frab} \alias{num_ge_frab} \alias{num_lt_frab} @@ -31,19 +33,22 @@ it calls low-level helper function \code{c_frab_eq()}, which calls its \proglang{C} namesake which is written for speed (specifically, returning \code{FALSE} as soon as it spots a difference between its - two arguments). + two arguments). Note that if any value is \code{NA}, \code{frab_eq()} + will return \code{FALSE}. } \usage{ frab_eq(e1,e2) frab_compare_frab(e1,e2) frab_eq_num(e1,e2) +frab_ne_num(e1,e2) frab_gt_num(e1,e2) frab_ge_num(e1,e2) frab_lt_num(e1,e2) frab_le_num(e1,e2) frab_compare_numeric(e1,e2) num_eq_frab(e1,e2) +num_ne_frab(e1,e2) num_gt_frab(e1,e2) num_ge_frab(e1,e2) num_lt_frab(e1,e2) diff --git a/man/Extract.Rd b/man/Extract.Rd index 0caaca1..783685c 100644 --- a/man/Extract.Rd +++ b/man/Extract.Rd @@ -5,6 +5,10 @@ \alias{values<-} \alias{values<-,frab,numeric-method} \alias{values<-,frab,disord-method} +\alias{names} +\alias{names,frab-method} +\alias{names<-,frab,disord-method} +\alias{names<-,frab,character-method} \alias{[} \alias{[.frab} \alias{[,frab-method} @@ -25,11 +29,15 @@ \alias{[<-,frab,ANY,ANY,ANY-method} \alias{[<-,frab,character,missing-method} \alias{[<-,frab,character,missing,numeric-method} +\alias{[<-,frab,character,missing,logical-method} \alias{[<-,frab,disord,missing-method} \alias{[<-,frab,disord,missing,frab-method} +\alias{[<-,frab,disord,missing,logical-method} \alias{[<-,frab,disord,missing,numeric-method} \alias{[<-,frab,disindex,missing,numeric,ANY-method} \alias{[<-,frab,disindex,missing,numeric-method} +\alias{[<-,frab,missing,missing,frab-method} +\alias{[<-,frab,missing,missing,numeric-method} \alias{[<-,frab,missing,missing,ANY-method} \title{Extraction and replacement methods for class \code{"frab"}} \description{ @@ -51,14 +59,20 @@ "missing", value = "ANY")}: \code{x["a"] <- 3}} \item{[<-}{\code{signature(x = "frab", i = "disord", j = "missing", value="frab")}: \code{x[x<0] <- -x[x<0]}; not implemented} + \item{[<-}{\code{signature(x = "frab", i = "disord", j = "missing", + value="logical")}: \code{x[x<0] <- NA}} \item{[<-}{\code{signature(x = "frab", i = "ANY",j = "ANY", value = "ANY")}: not implemented} \item{[<-}{\code{signature(x = "frab", i = "disindex",j = "missing", value = "numeric")}: \code{x[x>0] <- 3}} + \item{[<-}{\code{signature(x = "frab", i = "character", j = + "missing", value = "logical")}: \code{x["c"] <- NA}} } Double square extraction, as in \code{x[[i]]} and \code{x[[i]] <- - value}, is not currently defined. + value}, is not currently defined. In replacement methods, if + \code{value} is logical it is coerced to numeric (this includes + \code{NA}). } \author{Robin K. S. Hankin} @@ -81,5 +95,8 @@ v <- values(x) v[v<0] <- abs(v[v<0]) + 50 values(x) <- v +names(x) <- toupper(names(x)) +x + } diff --git a/man/frab-class.Rd b/man/frab-class.Rd index ed68d74..02c1c27 100644 --- a/man/frab-class.Rd +++ b/man/frab-class.Rd @@ -1,9 +1,7 @@ \name{frab-class} \docType{class} \alias{frab-class} -\alias{names} \alias{namedvector} -\alias{names,frab-method} \alias{namedvector,frab-method} \title{Class \dQuote{frab}} \description{The formal \proglang{S4} class for frab objects} @@ -15,7 +13,6 @@ and \code{namedvector()}. } \usage{ -\S4method{names}{frab}(x) \S4method{namedvector}{frab}(x) } \arguments{\item{x}{Object of class \code{frab}}} diff --git a/man/frab.Rd b/man/frab.Rd index 23c90fa..205644d 100644 --- a/man/frab.Rd +++ b/man/frab.Rd @@ -31,9 +31,15 @@ dispatches to \code{list_to_frab()}. If given a table it dispatches to \author{Robin K. S. Hankin} \seealso{\code{\link{frab-class}}} \examples{ + +frab(c(x=6,y=6,z=-4,u=0,x=3)) + as.frab(c(a=2,b=1,c=77)) as.frab(list(names=letters[5:2],values=1:4)) +x <- rfrab() +y <- rfrab() +x+y } diff --git a/man/misc.Rd b/man/misc.Rd index af6024d..be78aef 100644 --- a/man/misc.Rd +++ b/man/misc.Rd @@ -8,10 +8,13 @@ \alias{lapply.disord} \alias{is.na} \alias{is.na.frab} +\alias{is.na,frab-method} +\alias{is.notna} +\alias{is.notna.frab} +\alias{is.notna,frab-method} \alias{is.na<-} \alias{is.na<-.frab} \alias{is.na<-.frab} -\alias{is.na,frab-method} \alias{is.na<-.frab} \alias{is.na<-,frab,disord-method} \alias{!,frab-method} @@ -32,17 +35,22 @@ on \code{frab} object \code{x}, work with \code{values(x)} (which is a little more involved: \itemize{ - \item{length()} returns the length of the data component of the + \item\code{length()} returns the length of the data component of the object. - \item\code{which()} returns a \code{disind} object when given a - Boolean \code{frab} - \item{\code{is.na()} returns a logical \code{disord} object} -} + \item\code{which()} returns an error when called with a \code{frab} + object, but is useful here because it returns a \code{disind} when + given a Boolean \code{disord} object. This is useful for idiom such + as \code{x[x>0]} + \item Functions \code{is.na()} and \code{is.notna()} return a + \code{disind} object} } \value{Generally return frabs} \author{Robin K. S. Hankin} \note{ -note here + Constructions such as \code{!is.na(x)} do not work if \code{x} is a + \code{frab} object: this is because \code{is.na()} returns a + \code{disind} object, not a logical. Use \code{is.notna()} to + identify elements that are not \code{NA}. } \seealso{\code{\link{extract}}} \examples{ @@ -61,4 +69,8 @@ is.na(x) <- x<3 x x[is.na(x)] <- 100 x + +y <- frab(c(a=5,b=NA,c=3,d=NA)) +y[is.notna(y)] <- 199 +y } diff --git a/man/sparsetable.Rd b/man/sparsetable.Rd new file mode 100644 index 0000000..05ca6e8 --- /dev/null +++ b/man/sparsetable.Rd @@ -0,0 +1,196 @@ +\name{sparsetable} +\alias{sparsetable} +\alias{as.sparsetable} +\alias{is.sparsetable} +\alias{sparsetable-class} +\alias{index} +\alias{index,sparsetable-method} +\alias{values,sparsetable-method} +\alias{names,sparsetable-method} +\alias{dimnames,sparsetable-method} +\alias{dimnames<-,sparsetable-method} +\alias{dimnames<-,sparsetable,ANY-method} +\alias{is.empty,sparsetable-method} +\alias{arity} +\alias{arity,sparsetable-method} +\alias{dim} +\alias{dim,sparsetable-method} +\alias{asum} +\alias{asum.sparsetable} +\alias{asum,sparsetable-method} +\alias{asum_sparsetable} +\alias{asum_exclude_sparsetable} +\alias{as.array,sparsetable-method} +\alias{nterms} +\alias{nterms,sparsetable-method} +\alias{show,sparsetable-method} +\alias{print_sparsetable_matrixform} +\alias{sparsetable_to_table} +\alias{sparsetable_to_frab} +\alias{sparsetable_asum_include} +\alias{sparsetable_asum_exclude} +\alias{table_to_sparsetable} +\alias{sparsetable} +\alias{array_to_sparsetable} +\alias{sparsetable_to_array} +\alias{sparsetable_pmax} +\alias{sparsetable_pmin} +\alias{sparsetable_negative} +\alias{sparsetable_times_scalar} +\alias{sparsetable_eq_sparsetable} +\alias{sparsetable_equality} +\alias{sparsetable_maker} +\alias{rspar} +\alias{rspar2} +\alias{rsparr} +\alias{sparsetable_add} +\alias{sparsetable_negative} +\alias{sparsetable_reciprocal} +\alias{sparsetable_plus_sparsetable} +\alias{sparsetable_multiply_sparsetable} +\alias{sparsetable_multiply_numeric} +\alias{sparsetable_power_numeric} +\alias{numeric_compare_sparsetable} +\alias{numeric_multiply_sparsetable} +\alias{numeric_power_sparsetable} +\alias{sparsetable_accessor} +\alias{sparsetable_unary} +\alias{sparsetable_arith_sparsetable} +\alias{sparsetable_arith_numeric} +\alias{numeric_arith_sparsetable} +\alias{sparsetable_overwrite} +\alias{sparsetable_setter} +\alias{sparsetable_eq} +\alias{sparsetable_compare_sparsetable} +\alias{sparsetable_eq_num} +\alias{sparsetable_gt_num} +\alias{sparsetable_ge_num} +\alias{sparsetable_lt_num} +\alias{sparsetable_le_num} +\alias{sparsetable_compare_numeric} +\alias{num_eq_sparsetable} +\alias{num_gt_sparsetable} +\alias{num_ge_sparsetable} +\alias{num_lt_sparsetable} +\alias{num_le_sparsetable} +\alias{drop} +\alias{drop,sparsetable-method} +\alias{[,sparsetable-method} +\alias{[,sparsetable,disord,missing-method} +\alias{[,sparsetable,disindex,missing,ANY-method} +\alias{[,sparsetable,disord,missing,ANY-method} +\alias{[,sparsetable,ANY,ANY,ANY-method} +\alias{[<-,sparsetable-method} +\alias{[<-,sparsetable,ANY,ANY,ANY-method} +\alias{[<-,sparsetable,disindex,missing,ANY-method} +\alias{[<-,sparsetable,disord,missing,numeric-method} +\alias{pmax_sparsetable} +\alias{pmin_sparsetable} +\alias{pmax.sparsetable} +\alias{pmin.sparsetable} +\alias{pmax,sparsetable-method} +\alias{pmin,sparsetable-method} +\alias{pmax_pair_sparsetable} +\alias{pmin_pair_sparsetable} +\alias{pmax_dots_sparsetable} +\alias{pmin_dots_sparsetable} + +\title{Generalized sparse tables: \code{sparsetable} objects} +\description{Package idiom for creating and manipulating + \code{sparsetable} objects} +\usage{ +sparsetable(i,v=1) +rspar(n=15,l=3,d=3) +rspar2(n=15,l=6) +rsparr(n=20,d=6,l=5,s=4) +sparsetable_to_array(x) +array_to_sparsetable(x) +sparsetable_to_frab(x) +\S4method{index}{sparsetable}(x) +\S4method{values}{sparsetable}(x) +\S4method{dimnames}{sparsetable}(x) +\S4method{dim}{sparsetable}(x) +} +\arguments{ + \item{x}{In functions like \code{index()}, an object of class \code{sparsetable}} + \item{i,v}{In standard constructor function \code{sparsetable()}, + argument \code{i} is the index matrix of strings, and \code{v} a + numeric vector of values} + \item{n,l,d,s}{In functions \code{rspar()}, \code{rspar2()}, and + \code{rsparr()}, \code{n} is the number of terms, \code{l} the + number of letters, \code{d} the dimensionality and \code{s} the + number of distinct marginal values to return} +} +\details{ + +Most functions here mirror their equivalent in the \CRANpkg{spray} +package [which the \proglang{C} code is largely copied from] or the +\code{frab} functionality. So, for example, \code{num_eq_sparsetable()} +is the equivalent of \code{num_eq_spray()}. + +The print method treats arity-2 \code{sparsetable} objects differently +from other arities. By default, arity-2 \code{sparsetable} objects are +displayed as two-dimensional tables. Control this behaviour with option +\code{print_2dsparsetables_as_matrices}: + +\preformatted{ + options("print_2dsparsetables_as_matrices" = FALSE) +} + +The default value for this option, non-\code{FALSE} (including its +out-of-the-box status of \dQuote{unset}), directs the print method to +coerce arity-2 \code{sparsetable} objects to two-dimensional tables +before printing. If this option is \code{FALSE}, arity-2 sparsetables +are printed using matrix index form, just the same as any other arity. + +Functions \code{rspar()}, \code{rspar2()}, and \code{rsparr()} create +random \code{sparsetable} objects of increasing complexity. The +defaults are chosen to make the values of sensible sizes. + +Function \code{drop()} takes a sparsetable object of arity one and +coerces to a \code{frab} object. + +Function \code{dim()} returns a named vector, with names being the +\code{dimnames} of its argument. + +Extraction and replacement methods are a subset of \CRANpkg{spray} +methods, but most should work. There is special dispensation so that +standard idiom for arrays [e.g. \code{x['a','b','a']} and +\code{x['a','b','a'] <- 55}] work as expected, although the general +expectation is that access and replacement use (character) matrices and +an index object. However, indexing by \code{disord} and \code{disindex} +objects should also work [e.g. \code{x[x>7]}]. + +The \CRANpkg{spray} source code and the \code{sparstable} functionality +hve about 90\% overlap; there were enough small differences between the +codes to make it worth maintaining two sets of source code, IMO. + +There is a discussion of package idiom in the vignette, +\code{vignette("frab")}. + +} +\note{ + The pronunciation of \dQuote{sparsetable} has the emphasis on the + first syllable, so it rhymes with \dQuote{Barnable} or + \dQuote{Barnstaple}. +} +\author{Robin K. S. Hankin} +\seealso{\code{\link{frab-class}}} +\examples{ + +sparsetable(matrix(sample(letters[1:4],36,replace=TRUE),ncol=2),1:18) +sparsetable(matrix(sample(letters[1:4],39,replace=TRUE),ncol=3),1:13) + +(x <- rspar2(9)) +(y <- rspar2(9)) +x + y + +x["KT","FF"] <- 100 +x + +rsparr() + +a <- rspar(d=4) +asum(a,"Feb") + +} diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 4bdeeb0..425948f 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -36,6 +36,20 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// c_frab_multiply +List c_frab_multiply(const CharacterVector names1, const NumericVector values1, const CharacterVector names2, const NumericVector values2); +RcppExport SEXP _frab_c_frab_multiply(SEXP names1SEXP, SEXP values1SEXP, SEXP names2SEXP, SEXP values2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterVector >::type names1(names1SEXP); + Rcpp::traits::input_parameter< const NumericVector >::type values1(values1SEXP); + Rcpp::traits::input_parameter< const CharacterVector >::type names2(names2SEXP); + Rcpp::traits::input_parameter< const NumericVector >::type values2(values2SEXP); + rcpp_result_gen = Rcpp::wrap(c_frab_multiply(names1, values1, names2, values2)); + return rcpp_result_gen; +END_RCPP +} // c_frab_pmax List c_frab_pmax(const CharacterVector names1, const NumericVector values1, const CharacterVector names2, const NumericVector values2); RcppExport SEXP _frab_c_frab_pmax(SEXP names1SEXP, SEXP values1SEXP, SEXP names2SEXP, SEXP values2SEXP) { @@ -64,12 +78,129 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// sparsetable_maker +List sparsetable_maker(const CharacterMatrix& M, const NumericVector& d); +RcppExport SEXP _frab_sparsetable_maker(SEXP MSEXP, SEXP dSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M(MSEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d(dSEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_maker(M, d)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_add +List sparsetable_add(const CharacterMatrix& M1, const NumericVector& d1, const CharacterMatrix& M2, const NumericVector& d2); +RcppExport SEXP _frab_sparsetable_add(SEXP M1SEXP, SEXP d1SEXP, SEXP M2SEXP, SEXP d2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M1(M1SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d1(d1SEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M2(M2SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d2(d2SEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_add(M1, d1, M2, d2)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_overwrite +List sparsetable_overwrite(const CharacterMatrix& M1, const NumericVector& d1, const CharacterMatrix& M2, const NumericVector& d2); +RcppExport SEXP _frab_sparsetable_overwrite(SEXP M1SEXP, SEXP d1SEXP, SEXP M2SEXP, SEXP d2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M1(M1SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d1(d1SEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M2(M2SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d2(d2SEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_overwrite(M1, d1, M2, d2)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_accessor +NumericVector sparsetable_accessor(const CharacterMatrix& M, const NumericVector& d, const CharacterMatrix& Mindex); +RcppExport SEXP _frab_sparsetable_accessor(SEXP MSEXP, SEXP dSEXP, SEXP MindexSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M(MSEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d(dSEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type Mindex(MindexSEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_accessor(M, d, Mindex)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_setter +List sparsetable_setter(const CharacterMatrix& M1, const NumericVector& d1, const CharacterMatrix& M2, const NumericVector& d2); +RcppExport SEXP _frab_sparsetable_setter(SEXP M1SEXP, SEXP d1SEXP, SEXP M2SEXP, SEXP d2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M1(M1SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d1(d1SEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M2(M2SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d2(d2SEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_setter(M1, d1, M2, d2)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_equality +bool sparsetable_equality(const CharacterMatrix& M1, const NumericVector& d1, const CharacterMatrix& M2, const NumericVector& d2); +RcppExport SEXP _frab_sparsetable_equality(SEXP M1SEXP, SEXP d1SEXP, SEXP M2SEXP, SEXP d2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M1(M1SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d1(d1SEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M2(M2SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d2(d2SEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_equality(M1, d1, M2, d2)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_asum_include +List sparsetable_asum_include(const CharacterMatrix& M, const NumericVector& d, const IntegerVector& n); +RcppExport SEXP _frab_sparsetable_asum_include(SEXP MSEXP, SEXP dSEXP, SEXP nSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M(MSEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d(dSEXP); + Rcpp::traits::input_parameter< const IntegerVector& >::type n(nSEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_asum_include(M, d, n)); + return rcpp_result_gen; +END_RCPP +} +// sparsetable_pmax +List sparsetable_pmax(const CharacterMatrix& M1, const NumericVector& d1, const CharacterMatrix& M2, const NumericVector& d2); +RcppExport SEXP _frab_sparsetable_pmax(SEXP M1SEXP, SEXP d1SEXP, SEXP M2SEXP, SEXP d2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M1(M1SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d1(d1SEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type M2(M2SEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type d2(d2SEXP); + rcpp_result_gen = Rcpp::wrap(sparsetable_pmax(M1, d1, M2, d2)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { {"_frab_c_frab_identity", (DL_FUNC) &_frab_c_frab_identity, 2}, {"_frab_c_frab_add", (DL_FUNC) &_frab_c_frab_add, 4}, + {"_frab_c_frab_multiply", (DL_FUNC) &_frab_c_frab_multiply, 4}, {"_frab_c_frab_pmax", (DL_FUNC) &_frab_c_frab_pmax, 4}, {"_frab_c_frab_eq", (DL_FUNC) &_frab_c_frab_eq, 4}, + {"_frab_sparsetable_maker", (DL_FUNC) &_frab_sparsetable_maker, 2}, + {"_frab_sparsetable_add", (DL_FUNC) &_frab_sparsetable_add, 4}, + {"_frab_sparsetable_overwrite", (DL_FUNC) &_frab_sparsetable_overwrite, 4}, + {"_frab_sparsetable_accessor", (DL_FUNC) &_frab_sparsetable_accessor, 3}, + {"_frab_sparsetable_setter", (DL_FUNC) &_frab_sparsetable_setter, 4}, + {"_frab_sparsetable_equality", (DL_FUNC) &_frab_sparsetable_equality, 4}, + {"_frab_sparsetable_asum_include", (DL_FUNC) &_frab_sparsetable_asum_include, 3}, + {"_frab_sparsetable_pmax", (DL_FUNC) &_frab_sparsetable_pmax, 4}, {NULL, NULL, 0} }; diff --git a/src/frab.cpp b/src/frab.cpp index a0acbbd..e9b65d7 100644 --- a/src/frab.cpp +++ b/src/frab.cpp @@ -46,6 +46,23 @@ frab sum2(frab F1, frab F2){ } } +frab prod2(frab F1, frab F2){ + frab out; + if(F1.size() > F2.size()){ + for(auto it = F2.begin() ; it != F2.end() ; ++it){ // iterate through the smaller one + const string symbol = it->first; + out[symbol] = F1[symbol] * F2[symbol]; + } + return remove_zeros(out); + } else { + for(auto it = F1.begin() ; it != F1.end() ; ++it){ + const string symbol = it->first; + out[symbol] = F2[symbol] * F1[symbol]; + } + return remove_zeros(out); + } +} + frab frabmaker(const CharacterVector names, const NumericVector values){ if(names.size() != values.size()) { throw std::invalid_argument("names and values are not same length"); @@ -117,6 +134,17 @@ List c_frab_add( ) ); } +//[[Rcpp::export]] +List c_frab_multiply( + const CharacterVector names1, const NumericVector values1, + const CharacterVector names2, const NumericVector values2 + ){ + return retval(prod2( + frabmaker(names1,values1), + frabmaker(names2,values2) + ) ); +} + //[[Rcpp::export]] List c_frab_pmax( const CharacterVector names1, const NumericVector values1, diff --git a/src/sparsetable_ops.cpp b/src/sparsetable_ops.cpp new file mode 100644 index 0000000..832e5e7 --- /dev/null +++ b/src/sparsetable_ops.cpp @@ -0,0 +1,262 @@ +// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- + +#define container vector // Could be 'vector' or 'deque' (both work but there may be performance differences) + +#define STRICT_R_HEADERS +#include + +#include +#include +#include +#include +#include +#include +#include + + +using namespace Rcpp; + +typedef std::container mycont; // a mycont is a container [vector or deque] of strings +typedef std::map sparsetable; + +sparsetable prepare(const CharacterMatrix M, const NumericVector d){ + sparsetable S; + sparsetable::iterator it; + mycont v; + + for(int i=0; isecond == 0){ + it = S.erase(it); // in C++11, erase() returns *next* iterator + } else { + ++it; // else just increment the iterator + } + } + return(S); +} + +CharacterMatrix makeindex(const sparsetable &S){ // takes a sparsetable, returns the matrix of indices + const unsigned int ncol = S.begin()->first.size(); + CharacterMatrix out(S.size(),ncol); // index + mycont v; + unsigned int row=0, col=0; + + for(auto it=S.begin(); it != S.end(); ++it){ + v = it->first; + col = 0; + for(auto ci=v.begin() ; ci != v.end() ; ++ci){ + out(row,col++) = *ci; + } + row++; + } + return(out); +} + +NumericVector makevalue(const sparsetable &S){ // takes a sparsetable, returns data + NumericVector out(S.size()); // data + unsigned int i=0; + sparsetable::const_iterator it; // it iterates through a sparse array + + for(it=S.begin(); it != S.end(); ++it){ + out(i++) = it->second; // initialize-and-fill is more efficient than out.push_back(it->second) + } + return(out); +} + +List retval (const sparsetable &S){ // used to return a list to R + + // In this function, returning a zero-row matrix results in a + // segfault ('memory not mapped'). So we check for 'S' being zero + // size and, if so, return a special Nil value. This corresponds to + // an empty sparsetable object. + + if(S.size() == 0){ + return List::create(Named("index") = R_NilValue, + Named("value") = R_NilValue + ); + } else { + return List::create(Named("index") = makeindex(S), + Named("value") = makevalue(S) + ); + } +} + + +// [[Rcpp::export]] +List sparsetable_maker +( + const CharacterMatrix &M, const NumericVector &d + ){ + return retval(prepare(M,d)); +} + +// [[Rcpp::export]] +List sparsetable_add +( + const CharacterMatrix &M1, const NumericVector &d1, + const CharacterMatrix &M2, const NumericVector &d2 + ){ + sparsetable S1 = prepare(M1, d1); + sparsetable S2 = prepare(M2, d2); + + for (sparsetable::const_iterator it=S2.begin(); it != S2.end(); ++it){ + const mycont v = it->first; + S1[v] += S2[v]; // the meat: S1=S1+S2 (S1 += S2) + if(S1[v]==0){S1.erase(v);} + } + + return retval(S1); +} + + +// [[Rcpp::export]] +List sparsetable_overwrite // something like S1[ind(S2)] <- S2 +( + const CharacterMatrix &M1, const NumericVector &d1, + const CharacterMatrix &M2, const NumericVector &d2 + ){ + sparsetable S1 = prepare(M1, d1); + sparsetable S2 = prepare(M2, d2); + + for (sparsetable::const_iterator it=S2.begin(); it != S2.end(); ++it){ + const mycont v = it->first; + S1[v] = S2[v]; // the meat + } + + return retval(S1); +} + +// [[Rcpp::export]] +NumericVector sparsetable_accessor // returns S1[] +( + const CharacterMatrix &M, const NumericVector &d, + const CharacterMatrix &Mindex + ){ + sparsetable S; + mycont v; + signed int k=0; + NumericVector out(Mindex.nrow()); + + S = prepare(M, d); + + for(int i=0; i index ; d2 -> value + ){ + mycont v; + + sparsetable S1 = prepare(M1, d1); + sparsetable S2 = prepare(M2, d2); + + for(int i=0; ifirst; + if(S1[v] != S2[v]){ + return FALSE; + } else { + S2.erase(v); + } + } + // at this point, S1[v] == S2[v] for every index 'v' of S1; and we + // know that S1 and S2 are the same size, so S1 and S2 are identical: + + return TRUE; + +} + +// [[Rcpp::export]] +List sparsetable_asum_include +( + const CharacterMatrix &M, const NumericVector &d, + const IntegerVector &n + ){ + sparsetable S; + mycont v; + + for(int i=0; ifirst; + if(S2[v] > S1[v]){ S1[v] = S2[v];} // S1[v] = max(S1[v],S2[v]); + S2.erase(v); // not S2[v] = 0; // OK because the iterator is it1 and this line modifies S2 + } + + for (sparsetable::const_iterator it = S2.begin(); it != S2.end(); ++it){ //iterate through S2 keys not in S1 + const mycont v = it->first; + if(S2[v] > 0){ S1[v] = S2[v]; } + } + + return retval(S1); +} + + diff --git a/tests/testthat/test_aaa.R b/tests/testthat/test_aaa.R index 7365e09..852d28d 100644 --- a/tests/testthat/test_aaa.R +++ b/tests/testthat/test_aaa.R @@ -1,20 +1,33 @@ test_that("Test suite aaa.R",{ x <- frab(c(a=1,b=2,c=3,i=4)) expect_true(is.frab(x)) + expect_true(is.frab(as.frab(x))) expect_true(x == frab(c(b=2,a=1,i=4,c=3))) expect_true(x + c(a=1) == frab(c(a=2,b=2,i=4,c=3))) expect_true(c(a=1) + x == frab(c(a=2,b=2,i=4,c=3))) + + jjx <- x + jjx[] <- 1 + expect_true(jjx == 1/jjx) + expect_error(as.frab(1:5)) + + expect_error(x > as.frab(c(a=3,b=4))) + expect_true(is.namedvector(as.namedvector(x))) expect_true(is.namedlogical(as.namedvector(x)>2)) expect_true(is.unnamedvector(as.vector(as.namedvector(x)))) expect_true(x^2 == frab(c(a=1,b=4,c=9,i=16))) - expect_true(2^x == frab(c(a=2,b=4,c=8,i=16))) + expect_error(2^x) + expect_error(x^c(r=3)) doublex <- frab(c(c=6,a=2,i=8,b=4)) minusx <- frab(c(c=-3,a=-1,i=-4,b=-2)) expect_true(2*x == doublex) expect_true(x*2 == doublex) + expect_error(x * c(a=1)) + expect_error(c(a=1) * x) + expect_true(x/0.5 == doublex) expect_true(1/frab(c(a=1,b=1,i=1)) == frab(c(a=1,i=1,b=1))) @@ -27,18 +40,21 @@ test_that("Test suite aaa.R",{ expect_true(-x == minusx) expect_true( x == -minusx) - expect_error(x+5) - expect_error(x-5) - expect_error(2+x) - expect_error(2-x) + expect_true(x+5 == 5+x) + expect_true(x-5 == -5+x) + + expect_true(-x+5 == 5-x) + expect_true(-x-5 == -5-x) expect_true(sum(x == 2) == 1) + expect_true(sum(x != 2) == 3) expect_true(sum(x > 2) == 2) expect_true(sum(x >= 2) == 3) expect_true(sum(x < 2) == 1) expect_true(sum(x <= 2) == 2) expect_true(sum(2 == x) == 1) + expect_true(sum(2 != x) == 3) expect_true(sum(2 <= x) == 3) expect_true(sum(2 > x) == 1) expect_true(sum(2 >= x) == 2) @@ -52,6 +68,7 @@ test_that("Test suite aaa.R",{ expect_output(print(x)) options("frab_print_hash" = TRUE) expect_output(print(x)) + expect_output(print(x*0)) options("frab_print_hash" = FALSE) expect_output(print(x)) options("frab_print_hash" = 233) @@ -145,6 +162,7 @@ test_that("Test suite aaa.R",{ expect_error(c_frab_identity(letters[1:6],1:5)) expect_output(print(zero())) + expect_output(print(frab(c(a=1,b=3,c=5))*0)) jj <- c(a=3,b=1,d=3) expect_false(is.namedlogical(jj)) @@ -158,6 +176,92 @@ test_that("Test suite aaa.R",{ expect_false(is.namedlogical(jj>2)) expect_true(is.unnamedlogical(jj>2)) + x <- frab(c(b=6,a=3,y=8)) + expect_error(values(x) <- 1:3) + values(x) <- 3 + expect_true(x == frab(c(a=3,b=3,y=3))) + + x <- frab(c(b=6,a=3,y=8)) + values(x) <- values(x)^2 + expect_true(x == frab(c(a=9,b=36,y=64))) + + x <- frab(c(b=6,a=3,y=8)) + expect_error(values(x) <- disord(letters[1:3])) + + + x <- frab(c(b=6,a=3,y=8)) + names(x) <- toupper(names(x)) + expect_true(x == frab(c(Y=8 , B=6 , A=3))) + + expect_error(names(x) <- "o") + expect_error(names(x) <- letters) + + x <- frab(c(u=9)) + names(x) <- "foo" + expect_true(x == frab(c(foo=9))) + + x <- frab(c(a=6,b=3,c=2)) + y <- frab(c(b=1,c=5,x=3,yy=8)) + expect_true(y*x == frab(c(b=3,c=10))) + x <- frab(c(a=6,b=3,c=2)) + y <- frab(c(b=1,c=5,x=3,yy=8)) + expect_true(x*y == frab(c(b=3,c=10))) + expect_true(x*y == y*x) + + x1 <- frab(c(b=6,a=3,y=8)) + x2 <- frab(c(a=6,b=3,c=2)) + x3 <- frab(c(b=1,c=5,x=3,yy=8)) + x4 <- frab(c(yy=-3,a=5,c=3)) + expect_true(pmax(x1,x2,x3,x4) == frab(c(a=6,b=6,c=5,x=3,y=8,yy=8))) + expect_true(pmin(x1,x2,x3,x4) == frab(c(yy=-3))) + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + x["b"] <- NA + x[is.na(x)] <- 33 + expect_true(x == frab(c(a=1,b=33,c=2,d=5,e=6,f=-9))) + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + x[c("b","e")] <- NA + x[is.na(x)] <- 34 + expect_true(x == frab(c(a=1,b=34,c=2,d=5,e=34,f=-9))) + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + x[x<0] <- NA + x[is.na(x)] <- 35 + expect_true(x == frab(c(a=1,b=35,c=2,d=5,e=6,f=35))) + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + expect_silent(is.na(x) <- x>0) + expect_true(x["b"] == -4) + + expect_error(list_to_frab(list(names=frab::values(rfrab())))) + + expect_true(is.frab(rfrabb())) + expect_true(is.frab(rfrabbb())) + expect_output(print(rfrabb()*0)) + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + is.na(x) <- x>0 + expect_true(all(x[is.notna(x)] < 0)) + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + expect_true(max(x) == 6) + expect_true(min(x) == -9) + expect_true(sum(x) == 1) + expect_true(all(range(x) == c(-9,6))) + expect_error(prod(x)) + values(x) <- 1 + expect_true(x == 1/x) + + expect_true(all(pmax(1:5,5:1) == c(5,4,3,4,5))) + expect_true(all(pmin(1:5,5:1) == c(1,2,3,2,1))) + + + x <- frab(c(a=1,b=-4,c=2,d=5,e=6,f=-9)) + expect_error(x[] <- x) + expect_error(x[x != 6] <- x) + expect_error(x[values(x)] <- x) + expect_error(x[x<5] <- 6*x[x<5]) }) diff --git a/tests/testthat/test_aab.R b/tests/testthat/test_aab.R index f0fe22b..26144f7 100644 --- a/tests/testthat/test_aab.R +++ b/tests/testthat/test_aab.R @@ -27,6 +27,9 @@ checker1 <- function(A){ expect_true(pmax(A)==A) expect_true(pmin(A)==A) + expect_true(pmax(A,A) == A) + expect_true(pmin(A,A) == A) + } # checker1() closes checker2 <- function(A,B){ @@ -43,6 +46,10 @@ checker2 <- function(A,B){ expect_true(all(pmin(A,B)-A <= 0)) expect_true(all(pmin(A,B)-B <= 0)) + expect_true(length(A+B) <= length(A) + length(B)) + expect_true(length(A-B) <= length(A) + length(B)) + + } # checker2() closes checker3 <- function(A,B,C){ diff --git a/tests/testthat/test_aac.R b/tests/testthat/test_aac.R new file mode 100644 index 0000000..540507c --- /dev/null +++ b/tests/testthat/test_aac.R @@ -0,0 +1,265 @@ +test_that("Test suite aac.R",{ + x_c <- sparsetable( + i = matrix(letters[c( + 1,1,1,2,2,2,3,3,3,3,3, + 1,2,3,1,2,3,1,1,2,2,3, + 3,2,3,2,3,2,1,3,1,2,3 + )], ncol=3,dimnames=list(NULL,c("Jan","Feb","Mar"))), + v = c(8,6,16,21,15,9,11,3,15,3,13)) + + x <- x_c + expect_true(is.sparsetable(x)) + expect_true(is.sparsetable(x[x>20])) + expect_true(x == x) + expect_false(x != x) + expect_true(x+x == 2*x) + expect_true(x+x == x*2) + expect_true(x+x == sparsetable(index(x),values(x)*2)) + expect_true(is.empty(x-x)) + expect_true(all(dim(as.array(x-x))==0)) + expect_false(x == x*0) + expect_false(x == 0*x) + expect_true(x != 0*x) + + expect_error(names(x)) + expect_true(nterms(x) == 11) + expect_true(all(dim(x) == 3)) + expect_true(as.sparsetable(as.array(x)) == x) + expect_output(print(x)) + expect_output(print(x*0)) + expect_error(1/x) + expect_error(x*x) + expect_error(x^x) + expect_error(x^6) + expect_error(6^x) + + + + x['a','a','c'] <- 100 + expect_true(x == sparsetable( + matrix(letters[c(1,1,1,2,2,2,3,3,3,3,3,1,2,3,1,2,3,1,1,2,2,3,3,2,3,2,3,2,1,3,1,2,3)],11,3), + c(100,6,16,21,15,9,11,3,15,3,13)) + ) + + expect_false(sparsetable_equality( + M1 = matrix(letters[1:9],3,3), + d1 = 1:3, + M2 = index(x_c), + d2 = c(100,6,16,21,15,9,11,3,15,3,13)) + ) + + x['a','a','c'] <- 0 + expect_true( + x == sparsetable( + matrix(letters[c( + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, + 2, 3, 1, 2, 3, 1, 1, 2, 2, 3, + 2, 3, 2, 3, 2, 1, 3, 1, 2, 3 )],10,3), c( + 6,16,21,15, 9,11, 3,15, 3,13 )) + ) + + x <- x_c + expect_true(as.frab(x) == + frab(c(a_a_c = 8, a_b_b = 6, a_c_c = 16, b_a_b = 21, + b_b_c = 15, b_c_b = 9, c_a_a = 11, c_a_c = 3, + c_b_a = 15, c_b_b = 3, c_c_c = 13))) + + + options("print_2dsparsetables_as_matrices" = TRUE) + expect_output(print(sparsetable( + matrix(c("a", "a", "b", "b", "b", "c", "c", "d", "e", "e", + "e", "f", "A", "E", "B", "C", "D", "B", "D", "D", "A", "D", "E", + "C"), 12, 2, dimnames = list(NULL, c("foo", "bar"))), + 1:12) + )) + + options("print_2dsparsetables_as_matrices" = FALSE) + expect_output(print(sparsetable( + matrix(c("a", "a", "b", "b", "b", "c", "c", "d", "e", "e", + "e", "f", "A", "E", "B", "C", "D", "B", "D", "D", "A", "D", "E", + "C"), 12, 2, dimnames = list(NULL, c("foo", "bar"))), + 1:12) + )) + + + options("print_2dsparsetables_as_matrices" = NULL) + + I <- index(x) + colnames(I) <- NULL + expect_output(print(sparsetable(I,1:11))) + + expect_output(print(sparsetable(matrix(letters[1:12],4,3),1))) + expect_true(as.sparsetable(frab(c(a=1,b=2,c=3))) == sparsetable(cbind(letters[1:3]),1:3)) + + expect_true(as.sparsetable(table(data.frame(fish=letters[1:4],chips=LETTERS[4:1]))) == sparsetable(matrix(c("a","D","b","C","c","B","d","A"),byrow=TRUE,ncol=2))) + + expect_error(x*(1:3)) + expect_error((1:3)*x) + + expect_false(x == x*2) + + expect_false(x == rspar2()) + + x <- x_c + x['x','y','a'] <- 99 + expect_false(x == x_c) + expect_true(x['x','y','a'] == 99) + +# xpc = 'x plus zero' + xpz <-sparsetable( # the 10,10,10 == j,j,j entry is 77-77==0 + i=matrix(letters[c( + 1,1,1,2,2,2,3,3,10,3,3,3,10, + 1,2,3,1,2,3,1,1,10,2,2,3,10, + 3,2,3,2,3,2,1,3,10,1,2,3,10 + )], ncol=3, dimnames=list(NULL,c("Jan","Feb","Mar"))), + v=c(8,6,16,21,15,9,11,3,77,15,3,13,-77)) + + expect_true(x_c == xpz) + + + + jj <-sparsetable( + i=matrix(letters[c( + 1,1,1, + 1,2,3, + 3,9,3 + )], ncol=3, dimnames=list(NULL,c("Jan","Feb","Mar"))), + v=c(77,78,79)) + + xpz[] <- jj + expect_true(xpz == sparsetable( + i = matrix(c( + "a", "a", "a", "a", "b", "b", "b", "c", "c", "c", "c", "c", + "a", "b", "b", "c", "a", "b", "c", "a", "a", "b", "b", "c", + "c", "b", "i", "c", "b", "c", "b", "a", "c", "a", "b", "c" + ),12, 3), + v = c(77, 6, 78, 79, 21, 15, 9, 11, 3, 15, 3, 13)) + ) + + x <- x_c + x[index(x)[1:4,]] <- 0 + expect_false(x == x_c) + expect_false(x_c == x) + + x['c','a','c'] <- 334 + expect_false(x == x_c) + expect_false(x_c == x) + + xas <- asum(x_c,"Feb") + xas_correct <- sparsetable(matrix( + c("a", "a", "b", "b", "c", "c", "c", + "b", "c", "b", "c", "a", "b", "c" + ), 7,2, dimnames = list(NULL, c("Jan", "Mar"))), c(6, 24, 30, 15, 26, 3, 16)) + expect_true(xas == xas_correct) + + xas <- asum(x_c,c(FALSE,TRUE,FALSE)) + xas_correct <- sparsetable(matrix( + c("a", "a", "b", "b", "c", "c", "c", + "b", "c", "b", "c", "a", "b", "c" + ), 7,2, dimnames = list(NULL, c("Jan", "Mar"))), c(6, 24, 30, 15, 26, 3, 16)) + expect_true(xas == xas_correct) + + x <- x_c + expect_true(all(x[x > 9] > 9)) + expect_true(all(x[x < 9] < 9)) + expect_true(all(x[9 > x] < 9)) + expect_true(all(x[9 < x] > 9)) + expect_true(all(9 < x[x > 9])) + expect_true(all(9 > x[x < 9])) + expect_true(all(9 > x[9 > x])) + expect_true(all(9 < x[9 < x])) + + expect_true(all(x[x >= 9] >= 9)) + expect_true(all(x[x <= 9] <= 9)) + expect_true(all(x[9 >= x] <= 9)) + expect_true(all(x[9 <= x] >= 9)) + expect_true(all(9 <= x[x >= 9])) + expect_true(all(9 >= x[x <= 9])) + expect_true(all(9 >= x[9 >= x])) + expect_true(all(9 <= x[9 <= x])) + + expect_true(all(x[x == 9] == 9)) + expect_true(all(x[9 == x] == 9)) + expect_true(all(9 == x[x == 9])) + expect_true(all(9 == x[9 == x])) + + expect_true(all(x[which(x > 9)] > 9)) + expect_true(all(x[which(x < 9)] < 9)) + expect_true(all(x[which(9 > x)] < 9)) + expect_true(all(x[which(9 < x)] > 9)) + expect_true(all(9 < x[which(x > 9)])) + expect_true(all(9 > x[which(x < 9)])) + expect_true(all(9 > x[which(9 > x)])) + expect_true(all(9 < x[which(9 < x)])) + + expect_true(all(x[which(x >= 9)] >= 9)) + expect_true(all(x[which(x <= 9)] <= 9)) + expect_true(all(x[which(9 >= x)] <= 9)) + expect_true(all(x[which(9 <= x)] >= 9)) + expect_true(all(9 <= x[which(x >= 9)])) + expect_true(all(9 >= x[which(x <= 9)])) + expect_true(all(9 >= x[which(9 >= x)])) + expect_true(all(9 <= x[which(9 <= x)])) + + expect_true(all(x[which(x == 9)] == 9)) + expect_true(all(x[which(9 == x)] == 9)) + expect_true(all(9 == x[which(x == 9)])) + expect_true(all(9 == x[which(9 == x)])) + + + expect_true(all(x[index(x)[c(1,3,5,7),]] %in% c(8,11,15,16))) + + x <- x_c + expect_silent(jjx <- x[which(x>9)]) + expect_true(all(jjx > 9)) + + x <- x_c + expect_silent(jjx <- x[values(x) > 9]) + expect_true(all(jjx > 9)) + + + x <- x_c + expect_silent(x[which(x>9)] <- 0) + expect_true(all(x<=9)) + + x <- x_c + expect_silent(x[values(x) >= 9] <- 8) + expect_true(all(x <= 8)) + + x <- x_c + expect_error(x[which(x<8)] <- values(x)[x<8] + 333333) + + x <- x_c + expect_error(x[] <- seq_len(nterms(x))) + + x <- x_c + I <- matrix("a",3,3) + diag(I) <- "b" + S <- sparsetable(I,777) + expect_warning(x[S] <- 1:3) + expect_true(x == sparsetable(matrix(c( + "a","a","a","a","a","b","b","b","b","c","c","c","c","c", + "a","a","b","b","c","a","a","b","c","a","a","b","b","c", + "b","c","a","b","c","a","b","c","b","a","c","a","b","c" + ),14,3),c(1,8,2,6,16,3,21,15,9,11,3,15,3, 13))) + + + x <- x_c + expect_error(x[list('a','a','x')] <- 3333) + + expect_true(drop(sparsetable(matrix(letters[1:3],3),1:3)) == frab(c(a=1,b=2,c=3))) + + x <- x_c + expect_true(asum(x,"Feb") == asum_exclude_sparsetable(x,c("Jan","Mar"))) + + x <- x_c + jj <- c(TRUE,FALSE,TRUE) + expect_true(asum(x, jj) == asum_exclude_sparsetable(x,!jj)) + expect_true(asum(x,!jj) == asum_exclude_sparsetable(x, jj)) + + expect_true(asum(x,c(2 )) == asum_exclude_sparsetable(x,c(1,3))) + expect_true(asum(x,c(1,3)) == asum_exclude_sparsetable(x,c(2 ))) + +}) + + diff --git a/tests/testthat/test_aad.R b/tests/testthat/test_aad.R new file mode 100644 index 0000000..255f090 --- /dev/null +++ b/tests/testthat/test_aad.R @@ -0,0 +1,75 @@ +## Function checker1() has one argument, checker2() two, and +## checker3() has three. + +test_that("Test suite aad.R",{ + +checker1 <- function(A){ + expect_true(A == +A) + expect_true(A == -(-A)) + expect_true(A+A == 2*A) + expect_true(A+A == A*2) + + expect_true(is.empty(A-A)) + expect_true(A+A+A == 3*A) + expect_true(A+A+A == A*3) + + expect_true(A/2 + A/2 == A) + + expect_error(A&A) + + expect_true(pmax(A)==A) + expect_true(pmin(A)==A) + + expect_true(pmax(A,A) == A) + expect_true(pmin(A,A) == A) + + expect_true(sum(values(asum(A,1))) == sum(values(A))) + + + + +} # checker1() closes + +checker2 <- function(A,B){ + expect_true(A+B == B+A) + expect_true(2*A+B == A+A+B) + expect_true(A+2*B == B+B+A) + + expect_true(pmax(A,B) == pmax(B,A)) + expect_true(pmin(A,B) == pmin(B,A)) + + expect_true(all(pmax(A,B)-A >= 0)) + expect_true(all(pmax(A,B)-B >= 0)) + + expect_true(all(pmin(A,B)-A <= 0)) + expect_true(all(pmin(A,B)-B <= 0)) + +} # checker2() closes + +checker3 <- function(A,B,C){ + expect_true(A+(B+C) == (A+B)+C) # addition is associative; 1.2 + + expect_true(pmax(A,pmax(B,C)) == pmax(pmax(A,pmax(B,C)))) + expect_true(pmin(A,pmin(B,C)) == pmin(pmin(A,pmin(B,C)))) + + expect_true(pmax(A,B,C) == pmax(pmax(A,pmax(B,C)))) + expect_true(pmin(A,B,C) == pmin(pmin(A,pmin(B,C)))) + +} # checker3() closes + + +for(i in seq_len(10)){ + A <- rspar() + B <- rspar() + C <- rspar() + + checker1(A) + checker2(A,B) + checker3(A,B,C) + + checker1(rsparr()) +} + + + +} ) diff --git a/vignettes/frab.Rmd b/vignettes/frab.Rmd index 75a9a46..49e693f 100644 --- a/vignettes/frab.Rmd +++ b/vignettes/frab.Rmd @@ -1,5 +1,5 @@ --- -title: "An alternative implementation of named vectors: addition of `table`s with the `frab` package" +title: "Addition of `table` objects with the `frab` package" author: "Robin K. S. Hankin" output: html_vignette bibliography: frab.bib @@ -9,11 +9,11 @@ vignette: > %\VignetteEncoding{UTF-8} --- - ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) options(rmarkdown.html_vignette.check_title = FALSE) library("frab") +library("mvtnorm") set.seed(1) ``` @@ -24,8 +24,10 @@ set.seed(1) **TLDR**: Adding two objects of class `table` has a natural interpretation. However, in base R, adding two tables can give plausible but incorrect results. The `frab` package provides a -consistent and efficient way to add `table` objects. The underlying -mathematical structure is the Free Abelian group, hence "`frab`". +consistent and efficient way to add `table` objects, subject to +`disordR` discipline [@hankin2022_disordR]. The underlying +mathematical structure is the Free Abelian group, hence "`frab`". To +cite in publications, please use [@hankin2023_frab]. # Prologue: `table()` @@ -150,9 +152,48 @@ Above we see the `+` operator is defined between a `frab` and a `table`, coercing tables to `frab` objects to give consistent results. -Carefully regulated ambiguity +# Two dimensional tables + +The ideas above have a natural generalization to two-dimensional tables. + +```{r,label=twodeetables} +(x <- rspar2(9)) +(y <- rspar2(9)) +x+y +``` + +Above, note that the resulting sum is automatically resized to +accommodate both addends, and also that entries with nonzero values in +both `x` and `y` are correctly summed. + + +## Arbitrary-dimensioned tables +The one- and two- dimensional tables above have somewhat specialized +print methods and the general case with dimension $\geqslant 3$ uses +methods similar to those of the `spray` package. We can generate a +`sparsetable` object quite easily: +```{r label=threedeetables} +A <- matrix(0.95,3,3) +diag(A) <- 1 +x <- round(rmvnorm(300,mean=rep(10,3),sigma=A/7)) +x[] <- letters[x] +head(x) +(sx <- sparsetable(x)) +``` + +But we can add `sx` to other `sparsetable` objects: + +```{r label=showthreedeeadd} +(sz <- sparsetable(matrix(sample(letters[9:11],12,replace=TRUE),ncol=3),1001:1004)) +``` + +Then the usual semantics for addition operate: + +```{r label=usualsemantics} +sx + sz +``` ## References diff --git a/vignettes/frab.bib b/vignettes/frab.bib index ea181b1..f701fd9 100644 --- a/vignettes/frab.bib +++ b/vignettes/frab.bib @@ -7,12 +7,22 @@ @Manual{rcore2022 url = {https://www.R-project.org/}, } - @misc{hankin2022_disordR, - title = "Disordered vectors in {R}: introducing the disordR package", + title = "Disordered vectors in {R}: introducing the \texttt{disordR} package", author = "Robin K. S. Hankin", year = "2022", publisher = "arXiv", doi = "10.48550/ARXIV.2210.03856", url = "https://arxiv.org/abs/2210.03856" } + +@misc{hankin2023_frab, + title = "The free Abelian group in {R}: the \texttt{frab} package", + author = "Robin K. S. Hankin", + year = "2023", + publisher = "arXiv", + doi = "10.48550/ARXIV.2307.13184", + url = "https://arxiv.org/abs/2307.13184" +} + +