private void parseExceptionContents(
final Exception exception,
final OutputStream out)
{
final StackTraceElement[] stackTrace = exception.getStackTrace();
int index = 0;
for (StackTraceElement element : stackTrace)
{
final String exceptionMsg =
"Exception thrown from " + element.getMethodName()
+ " in class " + element.getClassName() + " [on line number "
+ element.getLineNumber() + " of file " + element.getFileName() + "]";
try
{
out.write((headerLine + newLine).getBytes());
out.write((headerTitlePortion + index++ + newLine).getBytes() );
out.write((headerLine + newLine).getBytes());
out.write((exceptionMsg + newLine + newLine).getBytes());
out.write(
("Exception.toString: " + element.toString() + newLine).getBytes());
}
catch (IOException ioEx)
{
System.err.println(
"IOException encountered while trying to write "
+ "StackTraceElement data to provided OutputStream.\n"
+ ioEx.getMessage() );
}
}
}
Вот базовое решение R
elementdf[apply(elementdf[,-1], 1, function(x) all(x %in% nodedf$nid)),]
Объяснение:
apply
работает путем «применения» функции (в данном случае пользовательской) к каждой строке (переменной x
в функции) объекта elementdf
. Если бы мы хотели сделать это по столбцам, мы бы изменили 1
на 2
.
Используемая нами функция просматривает каждый элемент в x
(строка в elementdf
) и проверяет, находится ли он также в nodedf
. %in%
- это специальная функция, которая возвращает вектор логики, элемент для каждого в x
. Функция all
возвращает TRUE
, если все элементы равны TRUE
(имеется в виду, что все они в nodedf
), а FALSE
в противном случае.
Таким образом, в конце оператор apply вернет вектор логики, в зависимости от того, есть ли в каждой строке элементы, найденные в nodedf
.
Чтобы получить значения в каждой строке, которых нет в nodedf
, вы можете сделать
apply(elementdf[,-1], 1, function(x) x[!(x %in% nodedf$nid)])
, что, как вы заметите, уже очень похоже на строку кода выше. За исключением этого случая, оператор apply
вернет список. Из приведенного вами примера это будет список длины 2, где первый элемент - numeric(0)
, а второй - вектор, содержащий 7. Если у вас есть несколько нарушителей в одной строке, будет показан каждый из них.
Чтобы удалить строки в nodedf
, которые не имеют ссылок в elementdf
, вы можете сделать
nodedf[nodedf$nid %in% unique(unlist(elementdf[,-1])),]
Часть unique(unlist(...))
просто захватывает все уникальные значения в elementdf[,-1]
], преобразуя их в числовой вектор.