public Double getValorVariable(String exp) {
        exp = exp.trim();
        Double ret = varValor.get(exp);
        if (ret != null) {
            return ret;
        }
        if (exp.isEmpty()) {
            return null;
        }
        int index = 0;
        while (index < exp.length() && exp.charAt(index) != '{') {
            index++;
        }
        if (index == exp.length() ) {
            return null;
        }
        for( int i=0; i<index; i++ ) {
            if( NOCARAC.indexOf(exp.charAt(i))>=0 ) {
                return null;
            }
        }
        int count=0;
        for( int i=index; i<exp.length(); i++ ) {
            if( exp.charAt(i)=='{' ) {
                count--;
            } else if(exp.charAt(i)=='}' ) {
                count++;
            }
            if( count==0 && i<exp.length()-1 || count>0 ){
                return null;
            }
        }
        if( count<0 ) {
            return null;
        }
        String name = exp.substring(0, index);
        String arg = exp.substring(index + 1, exp.length() - 1);
        String toks[] = separarPorComas(arg);
        if( error ) {
            return null;
        }
        if (name.equals("n") || name.equals("L")) {
            if (toks.length != 2) {
                error = true;
                strError.append("La variable ").append(name).append(" debe contener dos parametros para indexarla.\n");
                return null;
            }
        } else if (name.equals("X") || name.equals("R") || name.equals("r")
                || name.equals("R_") || name.equals("r_")) {
            if (toks.length != 3) {
                error = true;
                strError.append("La variable ").append(name).append(" debe contener tres parametros para indexarla.\n");
                return null;
            }

        } else {
            error = true;
            strError.append("La variable \"").append(name).append("\" no se puede indexar.\n");
            return null;
        }
        int i, j, k;
        double i1, i2, i3;
        switch (name) {
            case "n":
                if (toks[0].equals(".")) {
                    if (toks[1].equals(".")) {
                        return (double) datos.getN__();
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getM()) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getN_j()[j - 1];
                } else {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getN()) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }

                    if (toks[1].equals(".")) {
                        return (double) datos.getNi_()[i - 1];
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getM()) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getMatrizXijk()[i - 1][j - 1].length;
                }
            case "L":
                if (toks[0].equals(".")) {
                    error = true;
                    strError.append("La expresión ").append(exp).append(" no se puede indexar.\n");
                    return null;
                }
                i1 = evaluate(toks[0]);
                if (error) {
                    return null;
                }
                if (!isInteger(i1)) {
                    error = true;
                    strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                            append(exp).append("\" no es un entero.\n");
                    return null;
                }
                i = (int) i1;
                if (i < 1 || i > datos.getN()) {
                    error = true;
                    strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                            append(exp).append("\" no está dentro del rango válido.\n");
                    return null;
                }
                if (toks[1].equals(".")) {
                    return (double) datos.getNi_()[i - 1];
                }
                i2 = evaluate(toks[1]);
                if (error) {
                    return null;
                }
                if (!isInteger(i2)) {
                    error = true;
                    strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                            append(exp).append("\" no es un entero.\n");
                    return null;
                }
                j = (int) i2;
                if (j < 1 || j > datos.getDatosEstadisticaSecuencias().getBloquesL()[i - 1].size()) {
                    error = true;
                    strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                            append(exp).append("\" no está dentro del rango válido.\n");
                    return null;
                }
                return (double) datos.getDatosEstadisticaSecuencias().getBloquesL()[i - 1].get(j - 1);
            case "X":
                if (toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    return datos.getX___();
                }
                if (toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getVectorX_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return datos.getVectorX_j_()[j - 1];
                }
                if (!toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getVectorXi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return datos.getVectorXi__()[i - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getVectorXi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getVectorX_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return datos.getMatrizXij_()[i - 1][j - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && !toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getVectorXi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getVectorX_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i3 = evaluate(toks[2]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i3)) {
                        error = true;
                        strError.append("El índice \"").append(toks[2]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    k = (int) i3;
                    if (k < 1 || k > datos.getMatrizXijk()[i - 1][j - 1].length) {
                        error = true;
                        strError.append("El índice \"").append(toks[2]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return datos.getMatrizXijk()[i - 1][j - 1][k - 1];
                }
                error = true;
                strError.append("La expresión \"").append(exp).append("\" no es ").
                        append(" una expresión válida.\n");
                return null;
            case "R":
                if (toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    return (double) datos.getDatosEstadisticaRango().getR___();
                }
                if (toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaRango().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getVectorR_j_()[j - 1];
                }
                if (!toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaRango().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getVectorRi__()[i - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaRango().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaRango().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getMatrizRij_()[i - 1][j - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && !toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaRango().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaRango().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i3 = evaluate(toks[2]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i3)) {
                        error = true;
                        strError.append("El índice \"").append(toks[2]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    k = (int) i3;
                    if (k < 1 || k > datos.getDatosEstadisticaRango().getMatrizRijk()[i - 1][j - 1].length) {
                        error = true;
                        strError.append("El índice \"").append(toks[2]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getMatrizRijk()[i - 1][j - 1][k - 1];
                }
                error = true;
                strError.append("La expresión \"").append(exp).append("\" no es ").
                        append(" una expresión válida.\n");
                return null;
            case "r":
                if (toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    return (double) datos.getDatosEstadisticaSecuencias().getR___();
                }
                if (toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaSecuencias().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getVectorR_j_()[j - 1];
                }
                if (!toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaSecuencias().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getVectorRi__()[i - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaSecuencias().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaSecuencias().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getMatrizRij_()[i - 1][j - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && !toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaSecuencias().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaSecuencias().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i3 = evaluate(toks[2]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i3)) {
                        error = true;
                        strError.append("El índice \"").append(toks[2]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    k = (int) i3;
                    if (k < 1 || k > datos.getDatosEstadisticaSecuencias().getMatrizRijk()[i - 1][j - 1].length) {
                        error = true;
                        strError.append("El índice \"").append(toks[2]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getMatrizRijk()[i - 1][j - 1][k - 1];
                }
                error = true;
                strError.append("La expresión \"").append(exp).append("\" no es ").
                        append(" una expresión válida.\n");
                return null;
            case "R_":
                if (toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    return (double) datos.getDatosEstadisticaRango().getR___() / datos.getN__();
                }
                if (toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaRango().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getVectorR_j_()[j - 1] / datos.getN_j()[j - 1];
                }
                if (!toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaRango().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getVectorRi__()[i - 1] / datos.getNi_()[i - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaRango().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaRango().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaRango().getMatrizRij_()[i - 1][j - 1] / datos.getMatrizXijk()[i - 1][j - 1].length;
                }
                error = true;
                strError.append("La expresión \"").append(exp).append("\" no es ").
                        append(" una expresión válida.\n");
                return null;
            case "r_":
                if (toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    return (double) datos.getDatosEstadisticaSecuencias().getR___() / datos.getN__();
                }
                if (toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaSecuencias().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getVectorR_j_()[j - 1] / datos.getN_j()[j - 1];
                }
                if (!toks[0].equals(".") && toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaSecuencias().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getVectorRi__()[i - 1] / datos.getNi_()[i - 1];
                }
                if (!toks[0].equals(".") && !toks[1].equals(".") && toks[2].equals(".")) {
                    i1 = evaluate(toks[0]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i1)) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    i = (int) i1;
                    if (i < 1 || i > datos.getDatosEstadisticaSecuencias().getVectorRi__().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[0]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    i2 = evaluate(toks[1]);
                    if (error) {
                        return null;
                    }
                    if (!isInteger(i2)) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no es un entero.\n");
                        return null;
                    }
                    j = (int) i2;
                    if (j < 1 || j > datos.getDatosEstadisticaSecuencias().getVectorR_j_().length) {
                        error = true;
                        strError.append("El índice \"").append(toks[1]).append("\" correspondiente a \"").
                                append(exp).append("\" no está dentro del rango válido.\n");
                        return null;
                    }
                    return (double) datos.getDatosEstadisticaSecuencias().getMatrizRij_()[i - 1][j - 1] / datos.getMatrizXijk()[i - 1][j - 1].length;
                }
                error = true;
                strError.append("La expresión \"").append(exp).append("\" no es ").
                        append(" una expresión válida.\n");
                return null;
        }
        error = true;
        strError.append("La expresión \"").append(exp).append("\" no es ").
                append(" válida para indexar.\n");
        return null;
    }