Краткая версия
Можно ли заменить
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 в памяти.