Tworzenie wektora oddzielonego przecinkami


88

Mam wektor numeryczny, jeden, który próbuję przekształcić w wektor znakowy, w którym każdy element jest oddzielony przecinkami.

> one = c(1:5)
> paste(as.character(one), collapse=", ")
[1] "1, 2, 3, 4, 5"
> paste(as.character(one), sep="' '", collapse=", ")
[1] "1, 2, 3, 4, 5"

Jednak chcę, aby wynik wyglądał następująco:

"1", "2", "3", "4", "5" 

Czy brakuje mi jakiegoś parametru z funkcji wklejania? Wsparcie!?

Odpowiedzi:


91

shQuotejest prawdopodobnie najlepszym sposobem, aby to zrobić. W szczególności daje to pożądane wyniki:

cat(paste(shQuote(one, type="cmd"), collapse=", "))

Jeśli pojedyncze cudzysłowy są w porządku, możesz użyć:

paste(shQuote(one), collapse=", ")

type="cmd"w rzeczywistości zapewnia cudzysłowy ze znakiem ucieczki, co jest przydatne w większości kontekstów, ale jeśli naprawdę chcesz wyświetlić je gdzieś z cudzysłowami bez znaku ucieczki, catzapewnia to.


2
paste(shQuote(one), collapse=", ")podaje [1] "\"1\", \"2\", \"3\", \"4\", \"5\"", nie zawiera pojedynczego cudzysłowu.
vasili111

44

Mówisz, że chcesz wektor znakowy z tym wyjściem, ale inni, którzy znajdą to pytanie, mogą zamiast tego szukać jednej z tych funkcji:

Po pierwsze, sposób przygotowania danych wyjściowych do wprowadzenia do R; to byłoby dput:

> dput(as.character(one))
c("1", "2", "3", "4", "5")

Po drugie, sposób na wyprowadzenie pliku csv, który byłby write.csvlub write.table. Te funkcje przyjmują parametr file, który nie jest używany tutaj, w celu bezpośredniego wyprowadzenia do pliku.

> write.table(matrix(as.character(one),nrow=1), sep=",",
              row.names=FALSE, col.names=FALSE)
"1","2","3","4","5"

> write.csv(matrix(as.character(one),nrow=1),row.names=FALSE)
"V1","V2","V3","V4","V5"
"1","2","3","4","5"

1
Dzięki! To najbardziej eleganckie rozwiązanie
ikasznicki

14

Zakładając, że chcesz, aby wynik był w postaci ciągu znaków (a nie wektora znaków), możesz spróbować:

paste("'",as.character(one),"'",collapse=", ",sep="")

To daje pojedyncze cudzysłowy wokół liczb zamiast podwójnych cudzysłowów, ale w zasadzie wydaje się, że tego chcesz.

I zawsze możesz uciec, aby uzyskać podwójne cudzysłowy:

rs <- paste("\"",as.character(one),"\"",collapse=", ",sep="")
cat(rs)

to powinno wypisać to, co chcesz, w podwójnych cudzysłowach.


4

Oprócz tego shQuotezobacz funkcje sQuotei dQuotezawijanie tekstu odpowiednio w pojedyncze i podwójne cudzysłowy. Będziesz także chciał ustawić options(useFancyQuotes=FALSE)zwykłe (jednokierunkowe) cudzysłowy ASCII.



2

Aby dodać do odpowiedzi Noah, jeśli chcesz użyć pastefunkcji:

paste(shQuote(one, type="sh"), collapse=", ")

Powinien dać ci:

[1] '1','2','3','4','5'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.