ensurer, 在运行时,确保值按预期

分享于 

6分钟阅读

GitHub

 
Ensure values are as expected at runtime
  • 源代码名称:ensurer
  • 源代码网址:http://www.github.com/smbache/ensurer
  • ensurer源代码文档
  • ensurer源代码下载
  • Git URL:
    git://www.github.com/smbache/ensurer.git
    Git Clone代码到本地:
    git clone http://www.github.com/smbache/ensurer
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/smbache/ensurer
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    ensurer R 软件包

    确保运行时的值。

    Build Status

    ensurer 是用于 R的小型实用程序包,它提供了一种简单而轻量级的机制,用于确保运行时。

    R 不提供任何类型的安全机制,因为它不是编译的语言,因这里 Having 意外结果的风险。 对于相同的输入和/或者不同的情况,R 函数通常接受不同类型的不同类型。

    例如,对数据库或者网站的查询可以能不会返回有效数据,"有效期"可以引用许多条件。 它可能是正数或者一定数量的记录;所有情况都是完整的;某些列是每周递增的;或者仅仅是结果是一个 data.frame

    如果不恰当地处理这些歧义和风险,某些产生的错误可能难以跟踪,并可能以意外的方式传播。 当一个值没有正确的类型或者不满足某些条件时,最好得到一个错误。

    "确保值"这里的意思是"合同"或者一组条件,如果一个值不符合错误,就会立即引发( 除非特殊行为指定了特殊行为)。)。 使用 ensures_that 函数( 适用于多种使用或者复杂合同的可读性) 创建一个确保契约( 函数)。

    还可以使用 ensure_that (。简单,一次性合同) 来确保动态特性。

    使用 magrittr 管道 %>% 大大提高了这个包提供的功能的语义,但是不需要。

    这个软件包不是代替单元测试的代替,而且已经存在很好的软件包,比如 testthat。 在运行时条件可能破坏功能和错误应该尽快清除的脚本或者程序中,ensurer 包是理想的。 虽然是一个副作用,但是我的经验也会在开始时提升更好的设计决策,并帮助捕获编码错误。

    安装

    要安装当前的开发版本使用 devtools:

    
    devtools::install_github("smbache/ensurer")
    
    
    
    

    要安装CRAN版本:

    
    install.packages("ensurer")
    
    
    
    
    基本示例

    以下示例说明如何定义协定,确保它的输入是方的,以及如何使用它。

    library(magrittr) # for the pipe -> cleaner semanticslibrary(ensurer) # To reference the value being evaluated, use the `.` placeholder.ensure_square<- ensures_that(NCOL(.) == NROW(.))# try it out: diag(5) %>%
     ensure_square# passes, so returns the diagonal matrix# This won't work, and an error is raised.matrix(1:20, 4, 5) %>% 
     ensure_square# On the fly contracts:matrix(1:4, 2, 2) %>%
     ensure_that(is.matrix(.), all(is.numeric(.)))

    可以指定多个条件,每个条件用逗号分隔。 简单谓词函数可以用于缩写符号形式,如下面的示例所示。

    ensure_square<- ensures_that(is.matrix, 
     NCOL(.) == NROW(.))

    请注意,在测试时,所有的条件都会在失败时提供最大反馈。 如果需要"短路",可以添加更多的( 单独) 保证合同。

    ( c ) 类型和类型安全功能( 新的,实验性的,变更的)

    一个"类型"被定义为满足对应于前缀 type_的相应ensurer合约条件的对象。 例如 foo 类型将满足ensurer协定 type_foo的条件。 有一些内置类型,但是可以使用 ensures/ensures_that 轻松定义新类型,并遵循 type_ 命名约定。

    类型安全功能可以用 function_ 进行:

    f<-function_(a~integer, b~character:"Hello, World!", {
     rep(b, a)
    })
    f(10) # failsf(10L) # worksf(10L, "foo")type_lm<- ensures_that("lm"%in% class(.) ~"Value is not a linear model.")safe_lmsummary<-function_(model~lm, {
     summary(model)
    })
    safe_lmsummary(lm(Sepal.Length~., iris))

    类型 some 允许任何值,并可以用于允许不安全的输入。 ( 如果提供默认值,则为 some 默认类型,当未提供默认值时已经为默认类型。)

    的特殊特性包括
    • 自定义错误行为
    • 轻松组合多个合同
    • 自定义错误描述
    • 自定义个别条件的错误消息

    更多信息。有关更多信息,请参见包图片。


    EXP  Runtime  Expect  
    相关文章