Подтвердить что ты не робот

Как написать файлы с окончанием строк Unix на R для Windows

У меня есть R script, который создает текстовый файл в Windows.

Я использую функции write.table и write для записи в файл.

Затем мне нужно использовать этот файл в Unix-системах, но файл имеет символы конца строки Windows (^ M).

Возможно ли записать файлы с R в Windows с символами конца строки Unix?

Изменить

Вот пример воспроизводимости:

output.file <- file.path("./test.txt")

x <- c(1,2,3,4)
y <- c(5,6,7,8)
my.df <- data.frame(x, y)
my.df[] <- lapply(my.df, sprintf, fmt = "%14.7E")

write("First line", file = output.file)
write("Second line", file = output.file, append = TRUE)
write.table(my.df,
            row.names = FALSE,
            col.names = FALSE,
            file = output.file,
            quote = FALSE,
            append = TRUE,
            sep = "")

И результат, как видно NotePad ++:

введите описание изображения здесь

4b9b3361

Ответ 1

Как указано в help(write.table):

Чтобы записать файл в стиле Unix в Windows, используйте двоичное соединение, например. file = file ( "filename", "wb" ).

В вашем примере просто измените первую строку, чтобы открыть соединение "wb" и close в конце:

output.file <- file("./test.txt", "wb")

x <- c(1,2,3,4)
y <- c(5,6,7,8)
my.df <- data.frame(x, y)
my.df[] <- lapply(my.df, sprintf, fmt = "%14.7E")

write("First line", file = output.file)
write("Second line", file = output.file, append = TRUE)
write.table(my.df,
            row.names = FALSE,
            col.names = FALSE,
            file = output.file,
            quote = FALSE,
            append = TRUE,
            sep = "")

close(output.file)

введите описание изображения здесь

Ответ 2

Окончание строк типа unix может быть достигнуто с помощью wb write | двоичного режима в файлах.

Эта цитата из статьи Rnews может быть полезна: Ripley, B. D. (2001) Соединения. R News, 1/1, 16-7.

Текст vs двоичный Существует различие между текстовым и бинарным режимами. Предполагается, что текстовые функции, такие как сканирование и cat должен использовать соединения текстового режима, а двоичный режим используется с readBin и writeBin. Это различие еще не и основное различие заключается в том, являются ли файлы открыт в текстовом или двоичном режиме (если это имеет значение). Теперь похоже, что открытие всех файлов в двоичном режиме и управление переводом строки окончание внутри R приведет к меньшему количеству неожиданностей. Уже чтение из соединения в текстовом режиме переводит окончания строк из Unix (LF), DOS/Windows (CRLF) и Macintosh (CR) (и от всех соединения, а не только файлы).

# setup file connection
con <- file( output.file )

# open connection
if( !isOpen(con = con, rw = "wb") ) { open( con, open = "wb" ) }

# write contents
write( x = paste( colnames(my.df), collapse = "\t" ), file = con )
for( i in 1:nrow( my.df )){
  write(paste( my.df[i, ], collapse = "\t" ), file = con )
}
close( con )  # close and destroy a connection

# verify file contents
read.table(output.file, header = TRUE, sep = "\t")
#   x y
# 1 1 5
# 2 2 6
# 3 3 7
# 4 4 8