2016-12-24 4 views
2

parse - функция, возвращающая выражения. ВедениеРазница между определяющим выражением через синтаксический анализ или выражение

parse(text = "print('hey')") 

возвращает

expression(print('hey')) 

Можно также определить выражение, делая

expression(print('hey')) 

Немного удивительно выход это

expression(print("hey")) 

Обратите внимание на изменение в два раза кавычки. Но это не единственная разница. Передача parse(text = "print('hey')") на getParseData имеет отличный результат, чем при прохождении expression(print('hey')).

getParseData(parse(text = "print('hey')")) 

line1 col1 line2 col2 id parent    token terminal text 
9  1 1  1 12 9  0     expr FALSE  
1  1 1  1 5 1  3 SYMBOL_FUNCTION_CALL  TRUE print 
3  1 1  1 5 3  9     expr FALSE  
2  1 6  1 6 2  9     '('  TRUE  (
4  1 7  1 11 4  6   STR_CONST  TRUE 'hey' 
6  1 7  1 11 6  9     expr FALSE  
5  1 12  1 12 5  9     ')'  TRUE ) 

в то время как

getParseData(expression(print('hey'))) 

NULL 

Я не уверен, что разница между этими двумя выходами и я очень хотел бы знать.

Другой вопрос (который, вероятно, будет задан как отдельный вопрос, как только это будет дан ответ), что parse даже не согласуется с возвратом вывода «синтаксического анализа». Сначала я понял, что существует разница, когда я тестировал функцию, которая использует parse в среде тестирования Rstudio, которая вызывает devtools::test. Там parse(text = expression(print('hey'))) вернул двойной кавычный выход expression(print("hey")), который возвращает NULL при его переходе на getParseData

+0

Так вопрос, почему 'выражение (печать («эй»))' изменяет кавычки в двойные кавычки? Я не удивлен, что 'getParseData()' не возвращает информацию из вещей, которые не выполняются через 'parse()' - в ней нет никакой информации о строках и столбцах. Возможно, вы могли бы задать здесь явный вопрос? – MrFlick

+0

Точный вопрос заключается в том, какая разница между выходами. Информация о столбце строки, о которой вы упомянули, например. Как я могу диагностировать его отсутствие или присутствие на выходе (кроме попытки его разобрать), так как визуально два выхода выглядят довольно похожими. – OganM

+1

Если у вас есть 'a <-parse (text =" print ('hey') "); b <-expression (print ('hey')) 'сравнивает их структуру с 'str (a); str (b); 'Вы можете видеть, что они не совпадают. – MrFlick

ответ

3

Разница только в атрибутах. Если удалить атрибуты из разобранной версии, то они идентичны:

p <- parse(text = "print('hey')") 
attributes(p) <- NULL 

e <- expression(print('hey')) 

identical(p, e) 
## [1] TRUE