项目作者: brodieG

项目描述 :
Simple Programmable R NSE
高级语言: HTML
项目地址: git://github.com/brodieG/oshka.git
创建时间: 2017-09-09T00:07:27Z
项目社区:https://github.com/brodieG/oshka

开源协议:

下载


oshka - Recursive Quoted Language Expansion




Project Status: WIP - Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.

Programmable Non-Standard Evaluation

Non-Standard Evaluation (NSE hereafter) occurs when R expressions are
captured and evaluated in a manner different than if they had been executed
without intervention. subset is a canonical example, which we use here with
the built-in iris data set:

  1. subset(iris, Sepal.Width > 4.1)
  2. ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  3. ## 16 5.7 4.4 1.5 0.4 setosa
  4. ## 34 5.5 4.2 1.4 0.2 setosa

Sepal.Width does not exist in the global environment, yet this works because
subset captures the expression and evaluates it within iris.

A limitation of NSE is that it is difficult to use programmatically:

  1. exp.a <- quote(Sepal.Width > 4.1)
  2. subset(iris, exp.a)
  3. ## Error in subset.data.frame(iris, exp.a): 'subset' must be logical

oshka::expand facilitates programmable NSE, as with this simplified
version of subset:

  1. subset2 <- function(x, subset) {
  2. sub.exp <- expand(substitute(subset), x, parent.frame())
  3. sub.val <- eval(sub.exp, x, parent.frame())
  4. x[!is.na(sub.val) & sub.val, ]
  5. }
  6. subset2(iris, exp.a)
  7. ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  8. ## 16 5.7 4.4 1.5 0.4 setosa
  9. ## 34 5.5 4.2 1.4 0.2 setosa

expand is recursive:

  1. exp.b <- quote(Species == 'virginica')
  2. exp.c <- quote(Sepal.Width > 3.6)
  3. exp.d <- quote(exp.b & exp.c)
  4. subset2(iris, exp.d)
  5. ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  6. ## 118 7.7 3.8 6.7 2.2 virginica
  7. ## 132 7.9 3.8 6.4 2.0 virginica

We abide by R semantics so that programmable NSE functions are almost
identical to normal NSE functions, with programmability as a bonus.

Documentation

  • Intro
    vignette

    for a more in depth introduction to oshka, including a brief comparison to
    rlang.
  • NSE Functions with
    oshka

    in which we recreate simplified versions of dplyr and data.table that
    implement programmable NSE with oshka::expand.

Installation

This package is proof-of-concept. If it elicits enough interest we will
re-write the internals in C and add helper functions for common use patterns.

  1. install.packages('oshka')
  2. # or development version
  3. devtools::instal_github('brodieg/oshka@development')

Feedback is welcome, particularly if you are aware of some NSE pitfalls we may
be ignoring.

Acknowledgements

About

Brodie Gaslam is a hobbyist programmer based on the US East Coast.

The name of this package is derived from “matryoshka”, the Russian nesting
dolls.