2014-01-07 3 views
6

Я пытаюсь реплицировать команду оболочки в R и не могу понять, как сгруппировать команды вместе. Это просто возвращает содержимое рабочей папки (system() терпит неудачу по какой-то причине):Несколько команд оболочки в Windows

> shell("dir") 
Volume info .. 
Directory of E:\Documents\R 
contents are listed.. 

Теперь попробуем и перейти к C диск и запустить dir (без очевидного dir C:) ..

> shell("cd C:") 
C:\ 
> shell("dir") 
Volume in drive E is GT 
etc.. 

Таким образом, кажется, что команды нельзя вводить отдельно, поскольку оболочка не запоминает рабочий каталог. Итак ..

> (cmd = "cd C: 
+ dir") 
[1] "cd C:\ndir" 
> shell(cmd) 
C:\ 

Не повезло, так как папки C: не сообщаются. Другие методы, которые я пробовал, также терпят неудачу. Благодарен за любые идеи.

+0

Как отметил Konrad, Есть более эффективные способы, чтобы получить работу в 'r'. Например, используйте '' '' 'функцию' dir' с указанным именем пути. 'dir (path = 'E:/documents/r', pattern = 'whatever ...')' –

ответ

2

Я на Linux, и это работает для меня:

system("cd ..;ls") 

в навигации к предыдущей директории и работает Лс/реж там. В вашем случае, на Windows, это, видимо, работает:

shell("cd C: & dir") 

или получить результат в виде вектора символов:

shell("cd C: & dir", intern=T) и на Linux: system("cd ..; ls", intern=T)

+1

Спасибо! 'shell (" cd C: & dir ", intern = T)' для возврата символа char – geotheory

+1

В документации указано, что это не работает в Windows. –

+1

Да использовать оболочку вместо системы – geotheory

1

Не знаю, если это помогает, но рушится команд в одной строке при использовании system работ на MacOS

cmds <- c("ls", "cd ..", "ls"); 
system(paste(cmds, collapse=";")) 
+0

В документации указано, что это не работает в Windows. –

+0

@ Konrad Rudolph: Uups, извините, пропустил это ... –

4

The documentation объясняет, почему system не работает: он выполняет команду непосредственно в Windows, не создавая сначала оболочку.

shell (или лучше, system2) является путем, но, как вы заметили, shell всегда будут порождать новой оболочки так, что изменения в окружающую среду, не переносятся. system2 не будет работать напрямую, поскольку он цитирует его команды (и, следовательно, не позволяет цепочки команд).

Решение в этом контексте заключается не в использовании команды оболочки для изменения каталога. Используйте setwd вместо:

setwd('C:') 
system2('dir') 

Если вы хотите сбросить рабочий каталог после выполнения команды, используйте следующее:

local({ 
    oldwd = getwd() 
    on.exit(setwd(oldwd)) 
    setwd('C:') 
    system2('dir') 
}) 
+0

Отмечено, лучше setwd. – geotheory

0

Это решение от here. Это решило мою проблему Называя окна dir команду:

system("cmd.exe /c dir", intern=TRUE) 
Смежные вопросы