Преобразовать длину один символ в однобайтовую строку - PullRequest
1 голос
/ 24 августа 2011

ОК, я признаю, что название немного вводит в заблуждение. Сейчас я умник, поэтому я могу упустить что-то очевидное здесь.

Я работаю над R-powered webapp, и я хотел бы передать некоторые параметры функции read.table - sep среди других. Все работает как шарм, если я передаю однобайтовые символы в качестве аргумента sep: ,, ;, | ... но если я пытаюсь передать \t, я получаю ошибку:

invalid 'sep' value: must be one byte

Конечно, это происходит потому, что на самом деле \t сбежал (\\t). Есть ли вероятность того, что я смогу избежать побега и передать его "как есть", то есть однобайтовую строку?

1 Ответ

3 голосов
/ 24 августа 2011

Вам необходимо записать sep="\t" в качестве параметра read.table.

В случае вкладки, это t, который экранируется. Другими словами, вы говорите R, что t на самом деле не означает t, но tab. Если вы выберете \, используя \\, вы скажете R, что \ на самом деле не означает escape, а буквально \.

Вот код, иллюстрирующий правильное использование sep="\t" в read.table. И просто для удовольствия я использую textConnection, чтобы использовать соединение для записи и чтения, вместо использования файла на диске:

# Create a tab delimited file
zz <- textConnection("foo", "w")
write.table(matrix(1:12, ncol=3), file=zz, sep="\t")
close(zz)
foo

# The simple way:
tabsep <- "\t"

# The hard way, or if data was passed from a web app and you need to clean it
tabsep <- gsub("\\\\t", "\t", "\\t")


# Read a tab delimited file
zz <- textConnection(foo)
read.table(zz, sep=tabsep)
close(zz)

Это дает следующий вывод:

  V1 V2 V3
1  1  5  9
2  2  6 10
3  3  7 11
4  4  8 12
...