2012-09-29 6 views
1

Я использую RPy2, чтобы сделать некоторые сюжеты. Сюжет появляется, но окно X11 сразу исчезает.Заговоры, сделанные с rpy, отправленные в X11 внезапно закрываются?

Все, что я набрав следующее, где CCFS матрица данных

import rpy2.robjects as robjects 
r = robjects.r 

pca = r.princomp(CCFS) 
r.plot(pca,main="Eigenvalues") 
r.biplot(pca,main="biplot") 
r['dev.off']() #*EDIT* the problem persists even if I remove this line. 

Могу ли я не в состоянии включить что-то? Я знаю, что есть что-то для построения, потому что princomp возвращает ListVector, который не является нулевым.

+1

Вы делаете это в интерактивном режиме? Если это так, попробуйте не выполнять эту последнюю операцию '' dev.off''. – zwol

+0

Я сделал и ничего не меняет. Сюжет действительно появляется, но затем он закрывается. Я добавлю тэг x11. – mac389

+0

Нет, это в модуле Python. – mac389

ответ

3

Добавить

raw_input() 

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

+0

Это работает! Однако он не объясняет, почему окно X11 не сохраняется. Например, пример скрипта сценария RPy не использует это, поэтому я думаю, что мне не хватает более крупной точки. – mac389

+0

Когда объект 'r' является собранным мусором, он, по-видимому, закрывает любое созданное им окно. Я не знаю, о каком биплотном скрипте вы обращаетесь, но если он был из документации, он может просто показывать важные биты, предполагая, что вы либо знаете о 'raw_input()', либо используете код в более крупном сценарий, который не заканчивается. – unutbu

+0

А, я понимаю. Я не использую RPy для чего-либо еще в скрипте после строки биплота. Итак, конечно, умный сборщик мусора закроет все окна прямо там. Как будто этого недостаточно, скрипт Python также заканчивается прямо там. Как отметил @Zack, это убьет окно X11, даже если оно сохранится у сборщика мусора. Спасибо, теперь это имеет смысл. – mac389

3

Как Зак указал на то, что вызов dev.off() на интерактивных графических устройствах просто заставит устройство закрыть (и то, что он отображает, чтобы исчезнуть). С другой стороны, закрытие неинтерактивных устройств в основном требуется, прежде чем можно будет проверить график (см. rpy2's documentation on graphical devices).

Я предполагаю, что ваш код на Python вызывается как отдельная программа/скрипт, а не часть интерактивного сеанса Python. Другими словами, я подозреваю, что у вас есть что-то вроде python myscript.py в оболочке (содержимое myscript.py является вашим кодом выше); когда скрипт заканчивается, встроенный R, очевидно, завершается, беря с собой интерактивный сюжет. Скорее всего, это то, о чем думает Зак. Попробуйте python -i myscript.py, а затем один раз в консоли Python import sys; sys.exit(0), чтобы увидеть, что выход из Python означает закрытие R интерактивных устройств.

+0

Вы правы. Я привык к функциональности Matplotlib, где сценарий останавливается, пока вы не закроете сюжет, даже если вы создадите сюжет из автономного скрипта. – mac389

+0

Настройка устройств R, которые будут вести себя таким образом через rpy2, может быть возможна в будущем (например, http://rpy.sourceforge.net/rpy2/doc-2.3/html/graphicaldevices.html#rpy2.rinterface._rpy_device.GraphicalDevice.close). Однако это еще не так. – lgautier