Краткая версия
Можно ли заменить
source(filename, local = TRUE, encoding = 'UTF-8')
с
eval(parse(filename, encoding = 'UTF-8'))
без риска поломки, чтобы исходные файлы UTF-8 работали в Windows?
Длинная версия
В настоящее время я загружаю определенные исходные файлы через
source(filename, local = TRUE, encoding = 'UTF-8')
Однако хорошо известно, что это не работает в Windows, полная остановка.
В качестве обходного пути предложил Джо Ченг, используя вместо этого
eval(parse(filename, encoding = 'UTF-8'))
Это работает довольно хорошо 1 но даже после ознакомления с исходным кодом source
я не понимаю, как они отличаются одной важной деталью:
Оба source
и sys.source
делают не просто parse
, а затем eval
содержимое файла. Вместо этого они анализируют содержимое файла, а затем перебирают вручную по разобранным выражениям и eval
их по одному. Я не понимаю, почему это было необходимо в sys.source
(source
по крайней мере использует его для отображения подробной диагностики, если это указано, но sys.source
делает ничего подобного):
for (i in seq_along(exprs)) eval(exprs[i], envir)
Какова цель выражения eval
ing отдельно? И почему он вместо итераций перебирает вместо индексов непосредственно? Какие еще оговорки существуют?
Чтобы уточнить: меня не интересуют дополнительные параметры source
и parse
, некоторые из которых могут быть установлены с помощью опций.
1 Причина, по которой source
отключена кодировкой, но parse
не сводится к тому, что source
пытается преобразовать входной текст. parse
не делает этого, он считывает содержимое байта содержимого как есть и просто отмечает его Encoding
как UTF-8
в памяти.