2011-01-13 11 views
17

Podczas uruchamiania wtyczki R w SPSS, otrzymuję ciąg znaków ścieżki Windows jako dane wejściowe, np.Ignoruj ​​znaki escape (odwrotne ukośniki) w ciągach R

'C:\Users\mhermans\somefile.csv' 

ja jak użyć tej ścieżki w kolejnych kodu r, a następnie tnie muszą być zastąpione przez ukośnik, poza tym R interpretuje to jako ucieczki (np. „\ U stosować bez cyfr hex” błędy); .

Nie udało mi się jednak znaleźć funkcji, która mogłaby zastąpić ukośne ukośniki za pomocą ukośników lub podwójnych ucieczek. Wszystkie te funkcje zakładają, że te znaki zostały usunięte.

Tak, jest tam coś na wzór:

>gsub('\\', '/', 'C:\Users\mhermans') 
C:/Users/mhermans 
+0

Czy możesz podać co najmniej trochę więcej kodu wokół problemu? Skąd pochodzi sznur? Jak wprowadza kod R? Jeśli dostaniesz błąd, to jest za późno, a ten błąd występuje tak daleko, jak jestem dokładnie w punkcie, w którym ciąg przechodzi w R. –

Odpowiedz

12

Można spróbować użyć argumentu 'allowEscapes' w Skanuj()

X=scan(what="character",allowEscapes=F) 
C:\Users\mhermans\somefile.csv 

print(X) 
[1] "C:\\Users\\mhermans\\somefile.csv" 
+2

allowEscapes = FALSE jest domyślny, więc można skrócić to do 'x <- scan (what = "") ' –

+2

Scan() wydaje się być komendą interaktywną. Czy możliwe jest użycie w skrypcie, wywołanym przez okno dialogowe (w ten sposób uruchomione w tle)? – mhermans

+0

Jeśli umieścisz polecenie skanowania, a następnie dane wejściowe, a następnie pusty wiersz w skrypcie 'abc.R', a następnie uruchomisz' Rscript abc.R' w wierszu poleceń systemu operacyjnego, zadziała, ale nie zadziała, jeśli użyj 'source (" abc.R ")' z wnętrza R. –

5

Najpierw trzeba uzyskać to przypisane do imię i nazwisko:

pathname <- 'C:\\Users\\mhermans\\somefile.csv' 

Zauważ, że aby go wprowadzić do wektora nazw, musisz podwoić je wszystkie, co daje wskazówka o tym, jak można użyć wyrażenia regularnego:

gsub("\\\\", "/", pathname) 
# [1] "C:/Users/mhermans/somefile.csv" 

Trzeba było podwójnie podwójne ukośniki. Pierwszą z każdej pary jest zasygnalizowanie maszynie grep, że następna jest literalna.

+1

Ale R interpretuje "C: \\ Users \\ mhermans \\ somefile.csv" w taki sam sposób jak "C: /Users/mhermans/somefile.csv" w prawo?Problem polega na czytaniu łańcucha z pojedynczymi odwrotnymi ukośnikami i przekształcaniu go w jedno z tych dwóch rozwiązań. –

+0

Nie. Nie rozumiesz. W napisie, który stworzyłem, były tylko pojedyncze ukośniki. Musisz zrozumieć różnicę między reprezentacją a rzeczywistością. "\\" nie jest "/" . Spróbuj 'nchar (" \\ ")' dla dalszego postępu w kierunku oświetlenia. –

+1

Rzeczywiście mam ciąg znaków z pojedynczymi cudzysłowami jako danymi wejściowymi, a nie podwójnymi cudzysłowami. W tym przypadku rzeczywistość według R jest "hermans", reprezentowana przez "C: \ Users \ mhermans". Potrzebuję R, aby zdać sobie sprawę, że "C: \ Users \ mhermans" jest rzeczywistością. – mhermans

1

Jeśli plik E: \ Data \ junk.txt zawiera następujący tekst (bez cudzysłowów): C: \ Users \ mhermans \ somefile.csv

można dostać ostrzeżenie z następującym stwierdzeniem, ale będzie praca:

texinp <- readLines("E:\\Data\\junk.txt") 

Jeśli plik E: \ Data \ junk.txt zawiera następujący tekst (z cytatami): "C: \ Users \ mhermans \ somefile.csv"

powyższe stwierdzenie może również readlines daje ostrzeżenie, ale będzie teraz zawierał:

"\" C: \ Users \ mhermans \ somefile.csv \ ""

Tak więc, aby dostać to, czego chcesz, upewnij się, że nie są cytaty z pliku wejściowego, i zastosowanie:

texinp <- suppressWarnings(readLines("E:\\Data\\junk.txt")) 
+0

To wydaje się być możliwe, jeśli wypiszę ciąg znaków, który otrzymuję jako dane wejściowe z okna dialogowego do tymczasowego. plik i odczytać go z powrotem. Czy istnieje sposób, aby to zrobić bez kroku zapisu/odczytu? – mhermans

+0

@mhermans: 'readLines' może pobierać dane z dowolnego połączenia, a nie tylko z plików. Skąd czerpiesz swój napis? –

+0

@mhermans: Jak mówi powyżej Richie, może on przyjmować różne połączenia. Z komentarza dotyczącego "okna dialogowego" możesz spróbować skopiować ciąg do schowka. Następnie użyj texinp <- suppressWarnings (readLines ("clipboard")) –

Powiązane problemy