我的第一篇文章,所以我会尽量保持简单。我正在尝试使用Processing创建一些质谱数据图。我想编写一个草图来将数据从伪XML解析成表格,然后将这些数据绘制为2轴(时间,mz)上的点,第三轴(信号)作为点的颜色。
在这个阶段,我希望绘图是数据的维度。在我的测试数据中,x轴为38个时间点,Y为51 mz点,信号范围为0到12,000。实际数据集的界限在每个维度上都要大一百倍。
我的问题是图的宽度和高度取决于数据,建立这些限制涉及一些代码。在处理中,您只能在 void setup()之后立即调用 size(),因此我将所有计算代码放在第一位。这引起了标题错误。我无法解决它所以我将数据输出到三个csv文件并从第二个草图开始导入该数据并绘制它。我遇到了同样的错误。
确切的错误是期待EOF,找到'',其中可以是一行中的第一个单词。它已经用于, mzTable 和 if ,具体取决于我尝试过的代码。
这是完整的第二个草图:
import java.io.*;
int debug = 1;
String target = "M1A crop.txt"; // test data
File file = new File(target);
// ~ ~ ~
String folderPath = file.getParent(); // target folder path
String name = file.getName();
String mzData = folderPath + "\\" + name + " - mz data.csv" ; // CSV file to open
String signalData = folderPath + "\\" + name + " - signal data.csv" ; // CSV file to open
String summaryData = folderPath + "\\" + name + " - summary data.csv" ; // CSV file to open
Table mzTable = new Table();
Table signalTable = new Table();
Table summaryTable = new Table();
mzTable = loadTable(mzData, "header");
signalTable = loadTable(signalData, "header");
summaryTable = loadTable(summaryData, "header");
int timeMin = summaryTable.getInt(0, "timeMin");
int timeMax = summaryTable.getInt(0, "timeMax");
int mzMin = summaryTable.getInt(0, "mzMin");
int mzMax = summaryTable.getInt(0, "mzMax");
int signalMin = summaryTable.getInt(0, "signalMin");
int signalMax = summaryTable.getInt(0, "signalMax");
width = mzTable.getColumnCount(); // this is the number of time points on the X axis
height = mzMax - mzMin; // this is the number of mz points on the Y axis
println("time Min: " + timeMin + ", Max: " + timeMax);
println("mz Min: " + mzMin + ", Max: " + mzMax);
println("signal Min: " + signalMin + ", Max: " + signalMax);
void setup() {
size(width, height);
} // end of void setup()
void draw() {
for(int x = 0; x < height; x++) {
for(int y = 0; y < width; y++) {
stroke(map(signalTable.getInt(x, y), signalMin, signalMax, 0, 255));
point(x, y);
}
}
}
错误来源被识别为来自第19行:
mzTable = loadTable(mzData, "header");
我不是黑客,但我可以看到该代码没有任何问题。如果我从 void setup()开始注释掉所有内容,代码就会运行,因此它与在该函数之外使用导入和摘要代码有关。如果我把错误的代码放在它前面,比如只是 for(那么我期待EOF,找到'for'。有谁可以告诉我为什么?
非常感谢,
克里斯
编辑为derp 20:20 1-5-15
编辑22:00 1-5-15 我刚刚在Processing 3.0a7中尝试了草图,它有更好的错误报告。它已在第19行中识别出不同的错误:令牌上的语法错误,删除这些令牌。搜索此错误会引导我对这些问题提出诊断建议。 Syntax error on tokens, delete these tokens
答案 0 :(得分:3)
草图顶部应该只有声明。你不能拥有像重新分配这样的随机代码,也不能调用println()
函数。像这样的代码需要在函数内部。
例如,这一行很好,因为它是一个声明:
Table mzTable = new Table();
但这条线是不行的,因为它不是声明:
mzTable = loadTable(mzData, "header");
要解决该错误,只需将它们合并为一个声明行:
Table mzTable = loadTable(mzData, "header");
同样,你不能在函数之外进行这样的调用,因为它不是声明:
println("time Min: " + timeMin + ", Max: " + timeMax);
删除那些println()
函数,或将它们移动到setup()函数中。
与这些行相同:
width = mzTable.getColumnCount(); // this is the number of time points on the X axis
height = mzMax - mzMin; // this is the number of mz points on the Y axis
那些不是声明,所以它们必须在函数内部。也许尝试这样的事情:
void setup() {
width = mzTable.getColumnCount(); // this is the number of time points on the X axis
height = mzMax - mzMin; // this is the number of mz points on the Y axis
size(width, height);
}
虽然使用宽度和高度变量似乎是一个坏主意,所以你可能会这样做:
void setup() {
size(mzTable.getColumnCount(), mzMax - mzMin);
}
然后,处理将为您设置宽度和高度变量。