MyNixOS website logo
Description

Persist Attributes Across Data Operations.

In base R, object attributes are lost when objects are modified by common data operations such as subset, filter, slice, append, extract etc. This packages allows objects to be marked as 'sticky' and have attributes persisted during these operations or when inserted into or extracted from list-like or table-like objects.

Sticky: Persistent Attributes

CRAN_Status_Badge Downloads software impact

Lifecycle: stable

In base R, objects lose attributes in many common operations such as: subset, [, [[<-, append, etc. or when inserted into or extracted from recursive (list-like) objects such as data frames or data tables. Marking objects 'sticky', make attributes resilient to these operations. In essence, sticky makes object behave more like objects in other languages whose attributes are preserved. There isn't much to the package. sticky/unstickand sticky_all are the only interfaces to the package.

Key Functions

  • sticky: make an objects attributes persist across data operations

  • unstick: remove the stickiness of an object; attributes will no longer persist during common data operations

  • sticky_all : make all elements of a recursive object (e.g list, data frames, etc.) sticky.

Example

Here is an simple example of a sticky attribute in action. Under base R, attributes do not survive a slice/subset/[ operation:

x <- 1:5
attr(x, 'foo') <- 'bar'
attr(x[1:3],'foo')        # NULL -- attribute removed 

To ensure that they get preserved, simply declare the object as sticky:

x <- sticky(x)
attr(x[1:3],'foo')        # 'bar' -- attribute preserved    

sticky() works for vectors inside table-like objects ( i.e. data.frames and data.tables), preserving their attributes during table operations.

df <- data.frame( 
  sticky   = sticky( structure(1:5, foo="bar") ),
  nonstick = structure( letters[1:5], foo="baz" )
)
attr( df[2:3,"nonstick"], 'foo' )  # NULL
attr( df[2:3,"sticky"], 'foo' )    # bar

If all elements of a list or a data.frame need to behave in a sticky manner, use sticky_all.

df <- sticky_all(df)
attr( df[2:3,"nonstick"], 'foo' )  # Now 'baz'

Installation

Stable Version: CRAN (coming soon)

install.packages('sticky')

Development Version: Github

library(devtools)
lnstall_github('decisionpatterns/sticky')

Use Cases

There are a number of things that can be done with sticky:

  • Preserve attributes of atomic or recursive objects
  • Ensure that attributes of vectors in data.[frame|table] are preserved
  • Build a basic class system.

References

The issue of attribute resilience has been often asked and debated. Here are a few of the most prevalent discussions.

Metadata

Version

0.5.6.1

License

Unknown

Platforms (75)

    Darwin
    FreeBSD 13
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd13
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd13
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows