`getParseData` дает разные результаты в` interactive () `против Rscript - PullRequest
1 голос
/ 27 января 2020

Пожалуйста, смотрите ниже MWE

generate_summ_code= function(...) {
  code = substitute(list(...))[-1]
  gpd = getParseData(parse(text = deparse(code)), includeText = TRUE)
  print(gpd)
  gpd
}

generate_summ_code(n = n())

Если я запускаю это в REPL, я получаю распечатку

>    line1 col1 line2 col2 id parent                token terminal  text
> 10     1    1     1    5 10      0                 expr    FALSE n()()
> 6      1    1     1    3  6     10                 expr    FALSE   n()
> 1      1    1     1    1  1      3 SYMBOL_FUNCTION_CALL     TRUE     n
> 3      1    1     1    1  3      6                 expr    FALSE     n
> 2      1    2     1    2  2      6                  '('     TRUE     (
> 4      1    3     1    3  4      6                  ')'     TRUE     )
> 7      1    4     1    4  7     10                  '('     TRUE     (
> 8      1    5     1    5  8     10                  ')'     TRUE     )

Однако, если я помещаю код в файл, скажем code.r и я

Rscript code.r

или

R -e "source('code.r')"

Он просто возвращает NULL. В ?getParseData нет ничего, что указывает на то, что поведение должно быть другим?

Это ошибка в Base R?

1 Ответ

2 голосов
/ 27 января 2020

Разница в том, что в интерактивном режиме параметр keep.source установлен на TRUE, в противном случае он установлен на FALSE (если вы не переопределите его). Поэтому поведение parse отличается:

〉getParseData(parse(text = '1 + 1'), includeText = TRUE)
  line1 col1 line2 col2 id parent     token terminal  text
7     1    1     1    5  7      0      expr    FALSE 1 + 1
1     1    1     1    1  1      2 NUM_CONST     TRUE     1
2     1    1     1    1  2      7      expr    FALSE     1
3     1    3     1    3  3      7       '+'     TRUE     +
4     1    5     1    5  4      5 NUM_CONST     TRUE     1
5     1    5     1    5  5      7      expr    FALSE     1
〉getParseData(parse(text = '1 + 1', keep.source = FALSE), includeText = TRUE)
NULL
...