Така че това е необяснима грешка за мен и бих предложил, че е бъг, ако никой няма обяснение:
Имам следния код за импортиране на файл в R:
rm(list = ls())
library(data.table)
DT <- data.table(read.csv("file.csv", header=TRUE, sep = "Æ", quote = "", dec = ",", stringsAsFactors=TRUE, row.names = NULL))
Което работи перфектно. Винаги изнасям данните от Access посредством Æ
като сепаратор, защото е хубав характер, който никога не се появява в моите файлове.
Сега за грешката:
Когато създам нов файл ( "Import.r") с кода:
DT <- data.table(read.csv("file.csv", header=TRUE, sep = "Æ", quote = "", dec = ",", stringsAsFactors=TRUE, row.names = NULL))
И използвайте източника в оригиналния код:
rm(list = ls())
library(data.table)
source("import.r")
Получавам грешката:
Error in scan(file, what = "", sep = sep, quote = quote, nlines = 1, quiet = TRUE, :
invalid "sep" value: must be one byte
Интересното е, че ако не използвам Æ
като сепаратор, но |
тя работи перфектно при зареждането на файла. Така че грешката очевидно е причинена от използването Æ
като сепаратор (както е посочено в грешката така или иначе).
Но как една и съща команда за импортиране може да работи добре, когато се извика директно, но връща привидно несвързана грешка, когато се обажда чрез source()
?
РЕДАКТИРАНЕ: Четенето на героя чрез различни кодировки връща различни резултати:
> readLines(textConnection("Æ",encoding="utf-8"))
[1] "Æ"
> readLines(textConnection("Æ"))
[1] "Æ"
обстановка UTF-8 кодиране в кода, както Джеймс предложи в отговора си странно работи и файлът се импортира правилно.
Отговори:
1 за отговор № 1Изглежда, че това е въпрос на кодиране. При четене Æ
чрез текстова връзка с utf-8 кодиране получавате 2 знака, връщани:
readLines(textConnection("Æ",encoding="utf-8"))
[1] "Æ"
Странно обаче, задаването на utf-8 като кодиране при снабдяване позволява данните да се четат правилно.