1

我在将大型数据集从 Java 加载到 R 时遇到问题。问题实际上出在我正在使用的功能上:re.eval(). 我想将一个文件加载到 R 中,以便我可以在 R 中分析/操作它,但是我想从 Java 中执行此操作(这是为了构建一个 GUI)。

我想要函数做的是解析和评估我提供的字符串,但是,eval 函数会解析、评估并返回结果。我从 java 收到关于堆大小的内存不足错误。这是我目前的代码:

JButton getFile = new JButton("Load");
        getFile.setBounds(316, 10, 151, 23);
        getFile.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                    REXP x;
                    getFileName();
                if (dataFilePath != null){
                String file = dataFilePath.replace("\\", "\\\\\\\\");
                re.eval("data<-read.csv(file='"+file+"', head=TRUE, sep='|')");


                x = re.eval("names(data)");

                String[] column_names = x.asStringArray();
                originalDataLength = column_names.length;

                for (int i = 0; i < column_names.length; i++) {
                        comboBox.insertItemAt(column_names[i], 0);  
                    }

                textField.setText("Data Loaded");
                }

        }
    }
);

当我使用 13500x220 的数据框时,此代码有效。新数据框为 50000x700。我还想知道上面的代码到底发生了什么?它是在 R 中创建并发送回 java(即重复?)。

任何帮助/意见将不胜感激。我还查看了 Rosuda Rengine 类描述和可用功能;我在想也许rniEval()可以解决问题,但我不知道如何实现它。

4

1 回答 1

0

在事件堆栈上调用 actionPerformed,您应该保持事件处理简短。它也可能有帮助。称呼:

SwingUtilities.invokeLater(new Runnable() {
    public void run() { ... your code ... }
}

此外,如果只需要列名,则应该在 R 中结合两个 eval 表达式。也许只是阅读第一行(通过java?)。

于 2011-11-07T13:04:40.907 回答