R中代码质量的量化

时间:2013-09-30 15:45:08

标签: r matlab

在MATLAB中,我可以使用以下代码量化我的代码的简洁程度:

t = mtree('myCode.m','-file');
length(t.nodesize)

正如CODY(http://www.mathworks.com/matlabcentral/about/cody/)所描述的那样:

  

Cody使用节点计数计算来根据解析树中的节点数确定解决方案大小。将大小视为代码长度。编写简洁的代码可以获得更好的结果。注释不会影响代码大小。

     

为了说明Cody如何确定大小,这里有两个解决加一问题的方法。

     

解决方案1的大小为12:

function y = plus_one(x)
  y = x+1;
end
  

解决方案2的大小为16:

function y = plus_one(x)
  z = x;
  y = z+1;
end

有没有办法对R代码进行类似的计算? R中的代码质量还有其他可量化的指标吗? MATLAB还可以测量McCabe的复杂性,例如:

mlint -cyc myCode.m

1 个答案:

答案 0 :(得分:2)

也许这很有用:

#   line1 col1 line2 col2 id parent          token terminal     text
#33     1    1     1   34 33      0           expr    FALSE         
#1      1    1     1    8  1      3         SYMBOL     TRUE plus_one
#3      1    1     1    8  3     33           expr    FALSE         
#2      1   10     1   11  2     33    LEFT_ASSIGN     TRUE       <-
#32     1   13     1   34 32     33           expr    FALSE         
#4      1   13     1   20  4     32       FUNCTION     TRUE function
#5      1   21     1   21  5     32            '('     TRUE        (
#6      1   22     1   22  6     32 SYMBOL_FORMALS     TRUE        x
#7      1   23     1   23  7     32            ')'     TRUE        )
#29     1   25     1   34 29     32           expr    FALSE         
#9      1   25     1   25  9     29            '{'     TRUE        {
#10     1   26     1   26 10     12         SYMBOL     TRUE        y
#12     1   26     1   26 12     29           expr    FALSE         
#11     1   27     1   27 11     29      EQ_ASSIGN     TRUE        =
#19     1   28     1   30 19     29           expr    FALSE         
#13     1   28     1   28 13     15         SYMBOL     TRUE        x
#15     1   28     1   28 15     19           expr    FALSE         
#14     1   29     1   29 14     19            '+'     TRUE        +
#16     1   30     1   30 16     17      NUM_CONST     TRUE        1
#17     1   30     1   30 17     19           expr    FALSE         
#18     1   31     1   31 18     29            ';'     TRUE        ;
#24     1   33     1   33 24     26         SYMBOL     TRUE        y
#26     1   33     1   33 26     29           expr    FALSE         
#25     1   34     1   34 25     29            '}'     TRUE        }

sum(getParseData(parse(text="plus_one <- function(x) {y=x+1; y}"))$terminal)
#[1] 15

sum(getParseData(parse(text="plus_one <- function(x) {z = x; y = z+1; y}"))$terminal)
#[1] 19

我不确定我是否同意像

这样的一般性陈述
  

编写简洁的代码可以为您带来更好的结果。