code: public int numberOfNumericFeatures() {
      if( _numFeat!=-1 ) return _numFeat;
      ArrayList<Integer> idxs = new ArrayList<>();
      ArrayList<Integer> intCols = new ArrayList<>();
      ArrayList<Integer> dblCols = new ArrayList<>();
      ArrayList<Integer> binCols = new ArrayList<>();
      ArrayList<Integer> intNotBinCols = new ArrayList<>();
      int cnt=0;
      int idx=0;
      for(Vec v: _fr.vecs()) {
        boolean ignored = _cols[idx]._ignored;
        boolean response= _cols[idx]._response;
        if( v.isNumeric() && !ignored && !response) {
          cnt += 1;
          idxs.add(idx);
          if( v.isInt() ) intCols.add(idx);
          if( v.isBinary() ) binCols.add(idx);
          if( v.isInt() && !v.isBinary() ) intNotBinCols.add(idx);
          if( v.isNumeric() && !v.isInt() ) dblCols.add(idx);
        }
        idx++;
      }
      _numFeats = intListToA(idxs);
      _intCols  = intListToA(intCols);
      _dblCols  = intListToA(dblCols);
      _binaryCols  = intListToA(binCols);
      _intNotBinaryCols = intListToA(intNotBinCols);
      return (_numFeat=cnt);
    }
docs: If predictors were passed, then any values computed/cached are based on those
  predictors
  @return