⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rconsolemodel.java

📁 knime 是一个非常优秀的数据挖掘平台
💻 JAVA
字号:
/*  * ------------------------------------------------------------------- * Copyright, 2003 - 2006 * University of Konstanz, Germany. * Chair for Bioinformatics and Information Mining * Prof. Dr. Michael R. Berthold * * This file is part of the R integration plugin for KNIME. * * The R integration plugin is free software; you can redistribute  * it and/or modify it under the terms of the GNU General Public License  * as published by the Free Software Foundation; either version 2 of the  * License, or (at your option) any later version. *  * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St., Fifth Floor, Boston, MA 02110-1301, USA. * Or contact us: contact@knime.org. * ------------------------------------------------------------------- * */package org.knime.ext.r.node;import java.io.File;import java.io.IOException;import java.util.Vector;import org.knime.core.data.DataColumnSpec;import org.knime.core.data.DataColumnSpecCreator;import org.knime.core.data.DataRow;import org.knime.core.data.DataTable;import org.knime.core.data.DataTableSpec;import org.knime.core.data.container.DataContainer;import org.knime.core.data.def.DefaultRow;import org.knime.core.data.def.DefaultTable;import org.knime.core.data.def.DoubleCell;import org.knime.core.data.def.IntCell;import org.knime.core.data.def.StringCell;import org.knime.core.node.BufferedDataTable;import org.knime.core.node.CanceledExecutionException;import org.knime.core.node.ExecutionContext;import org.knime.core.node.ExecutionMonitor;import org.knime.core.node.InvalidSettingsException;import org.knime.core.node.NodeLogger;import org.knime.core.node.NodeSettingsRO;import org.knime.core.node.NodeSettingsWO;import org.rosuda.JRclient.RBool;import org.rosuda.JRclient.REXP;import org.rosuda.JRclient.Rconnection;/** * Executes R command and returns the result of the variable R as output. *  * @author Thomas Gabriel, University of Konstanz */public class RConsoleModel extends RNodeModel {    private String[] m_expression = new String[0];        private static final NodeLogger LOGGER =         NodeLogger.getLogger(RConsoleModel.class);        /**     *      *      */    protected RConsoleModel() {        super(1, 1);    }    /**     * @see org.knime.core.node.NodeModel     *      #execute(BufferedDataTable[],     *      ExecutionContext)     */    @Override    protected BufferedDataTable[] execute(final BufferedDataTable[] inData,            final ExecutionContext exec) throws CanceledExecutionException,            Exception {        Rconnection rconn = getRconnection();        // send data to R Server        RConnection.sendData(rconn, inData[0], exec);        // send expression to R Server        for (int i = 0; i < m_expression.length; i++) {            LOGGER.debug("eval: " + m_expression[i]);            rconn.voidEval("try(" + m_expression[i] + ")");            LOGGER.debug("sucessful");        }        REXP rexp = rconn.eval("try(R)");        LOGGER.debug("R: " + rexp.toString());        switch (rexp.getType()) {            case REXP.XT_ARRAY_BOOL :                BufferedDataTable boolArrayOut = readBooleanArray(rexp, exec);                return new BufferedDataTable[]{boolArrayOut};            case REXP.XT_ARRAY_INT :                BufferedDataTable intArrayOut = readIntArray(rexp, exec);                return new BufferedDataTable[]{intArrayOut};            case REXP.XT_BOOL :                BufferedDataTable boolOut = readBoolean(rexp, exec);                return new BufferedDataTable[]{boolOut};                     case REXP.XT_DOUBLE :                BufferedDataTable dblOut = readDouble(rexp, exec);                return new BufferedDataTable[]{dblOut};               case REXP.XT_INT :                BufferedDataTable intOut = readInt(rexp, exec);                return new BufferedDataTable[]{intOut};            case REXP.XT_STR :                BufferedDataTable strOut = readString(rexp, exec);                return new BufferedDataTable[]{strOut};               case REXP.XT_SYM :                BufferedDataTable symOut = readString(rexp, exec);                return new BufferedDataTable[]{symOut};             case REXP.XT_UNKNOWN :                return new BufferedDataTable[]{null};            case REXP.XT_VECTOR :                BufferedDataTable vecOut = readVector(rexp, exec);                return new BufferedDataTable[]{vecOut};            case REXP.XT_NULL :                return new BufferedDataTable[]{null};            case REXP.XT_ARRAY_DOUBLE :                BufferedDataTable dblArrayOut = readDoubleArray(rexp, exec);                return new BufferedDataTable[]{dblArrayOut};            default:                throw new IllegalArgumentException("Unsupported type: " + rexp);        }    }        private BufferedDataTable readString(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        String matrix = rexp.asString();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", StringCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataRow row = new DefaultRow(new StringCell("Row1"), matrix);        DataTable table = new DefaultTable(new DataRow[]{row},                 new DataTableSpec(cspec));        return exec.createBufferedDataTable(table, exec);    }        private BufferedDataTable readDouble(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        double matrix = rexp.asDouble();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", DoubleCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataRow row = new DefaultRow(new StringCell("Row1"),                 new double[]{matrix});        DataTable table = new DefaultTable(new DataRow[]{row},                 new DataTableSpec(cspec));        return exec.createBufferedDataTable(table, exec);    }        private BufferedDataTable readInt(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        int matrix = rexp.asInt();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", IntCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataRow row = new DefaultRow(new StringCell("Row1"), new int[]{matrix});        DataTable table = new DefaultTable(new DataRow[]{row},                 new DataTableSpec(cspec));        return exec.createBufferedDataTable(table, exec);    }        private BufferedDataTable readBoolean(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        RBool matrix = rexp.asBool();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", StringCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataRow row = new DefaultRow(new StringCell("Row1"), matrix.toString());        DataTable table = new DefaultTable(new DataRow[]{row},                 new DataTableSpec(cspec));        return exec.createBufferedDataTable(table, exec);    }        private BufferedDataTable readBooleanArray(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        RBool[] matrix = (RBool[]) rexp.getContent();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", StringCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataContainer dc = new DataContainer(new DataTableSpec(cspec));        for (int i = 0; i < matrix.length; i++) {            exec.checkCanceled();            exec.setProgress(1.0 * i / matrix.length);            dc.addRowToTable(new DefaultRow(new StringCell("Row" + (i + 1)),                    matrix[i].toString()));        }        dc.close();        return exec.createBufferedDataTable(dc.getTable(), exec);    }    private BufferedDataTable readDoubleArray(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        double[] matrix = rexp.asDoubleArray();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", DoubleCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataContainer dc = new DataContainer(new DataTableSpec(cspec));        for (int i = 0; i < matrix.length; i++) {            exec.checkCanceled();            exec.setProgress(1.0 * i / matrix.length);            dc.addRowToTable(new DefaultRow(new StringCell("Row" + (i + 1)),                    matrix[i]));        }        dc.close();        return exec.createBufferedDataTable(dc.getTable(), exec);    }        private BufferedDataTable readVector(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        Vector matrix = rexp.asVector();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R",                         StringCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataContainer dc = new DataContainer(new DataTableSpec(cspec));        for (int i = 0; i < matrix.size(); i++) {            exec.checkCanceled();            exec.setProgress(1.0 * i / matrix.size());            dc.addRowToTable(new DefaultRow(new StringCell("Row" + (i + 1)),                    ((REXP) matrix.get(i)).asString()));        }        dc.close();        return exec.createBufferedDataTable(dc.getTable(), exec);    }        private BufferedDataTable readIntArray(            final REXP rexp, final ExecutionContext exec)             throws CanceledExecutionException {        int[] matrix = rexp.asIntArray();        DataColumnSpec[] cspec = new DataColumnSpec[1];        for (int i = 0; i < cspec.length; i++) {            DataColumnSpecCreator colspeccreator =                 new DataColumnSpecCreator("R", IntCell.TYPE);            cspec[i] = colspeccreator.createSpec();        }        DataContainer dc = new DataContainer(new DataTableSpec(cspec));        for (int i = 0; i < matrix.length; i++) {            exec.checkCanceled();            exec.setProgress(1.0 * i / matrix.length);            dc.addRowToTable(new DefaultRow(new StringCell("Row" + (i + 1)),                    new int[]{matrix[i]}));        }        dc.close();        return exec.createBufferedDataTable(dc.getTable(), exec);    }    /**     * @see org.knime.core.node.NodeModel#reset()     */    @Override    protected void reset() {    }    /**     * @see org.knime.core.node.NodeModel     *      #configure(org.knime.core.data.DataTableSpec[])     */    @Override    protected DataTableSpec[] configure(final DataTableSpec[] inSpecs)            throws InvalidSettingsException {        testExpressions(m_expression);        checkRconnection();        return new DataTableSpec[1];    }    private void testExpressions(final String[] rexps)            throws InvalidSettingsException {        for (int i = 0; i < rexps.length; i++) {            String test = rexps[i].replace(" ", "");            if (test.startsWith("R<-")) {                // ok, we have an result in R                return;            }        }        throw new InvalidSettingsException("The result has to be provided"                + " inside the variable R");    }    /**     * @see org.knime.core.node.NodeModel     *      #saveSettingsTo(NodeSettingsWO)     */    @Override    protected void saveSettingsTo(final NodeSettingsWO settings) {        super.saveSettingsTo(settings);        settings.addStringArray("EXPRESSION", m_expression);    }    /**     * @see org.knime.core.node.NodeModel     *      #loadValidatedSettingsFrom(NodeSettingsRO)     */    @Override    protected void loadValidatedSettingsFrom(final NodeSettingsRO settings)            throws InvalidSettingsException {        super.loadValidatedSettingsFrom(settings);        m_expression = settings.getStringArray("EXPRESSION");    }    /**     * @see org.knime.core.node.NodeModel     *      #validateSettings(NodeSettingsRO)     */    @Override    protected void validateSettings(final NodeSettingsRO settings)            throws InvalidSettingsException {        super.validateSettings(settings);        testExpressions(settings.getStringArray("EXPRESSION"));    }        /**     * @see org.knime.core.node.NodeModel#loadInternals(     * File, ExecutionMonitor)     */    @Override    protected void loadInternals(final File nodeInternDir,             final ExecutionMonitor exec)             throws IOException, CanceledExecutionException {            }    /**     * @see org.knime.core.node.NodeModel#saveInternals(     * File, ExecutionMonitor)     */    @Override    protected void saveInternals(final File nodeInternDir,             final ExecutionMonitor exec)             throws IOException, CanceledExecutionException {            }    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -