2016-10-20 13 views
0

Основной вопрос: скажем, я писал функции R, которые называли python через rPython, и я хочу интегрировать это в пакет. Это просто --- неважно, что функция R обтекает Python, и вы продолжаете, как обычно. напримерКак вы импортируете библиотеку Python в R-пакете с помощью rPython?

# trivial example 
# library(rPython) 
add <- function(x, y) { 
    python.assign("x", x) 
    python.assign("y", y) 
    python.exec("result = x+y") 
    result <- python.get("result") 
    return(result) 
} 

Но что, если питон код с функциями R требуют пользователей импортировать библиотеки Python первыми? например

# python code, not R 
import numpy as np 
print(np.sin(np.deg2rad(90))) 

# R function that call Python via rPython 
# *this function will not run without first executing `import numpy as np` 
print_sin <- function(degree){ 
    python.assign("degree", degree) 
    python.exec('result = np.sin(np.deg2rad(degree))') 
    result <- python.get('result') 
    return(result) 
} 

Если запустить это без импорта библиотеки numpy, вы получите сообщение об ошибке.

Как вы импортируете библиотеку Python в пакет R? Как вы прокомментируете это с помощью roxygen2?

Оказывается стандарт R это:

# R function that call Python via rPython 
# *this function will not run without first executing `import numpy as np` 
print_sin <- function(degree){ 
    python.assign("degree", degree) 
    python.exec('import numpy as np') 
    python.exec('result = np.sin(np.deg2rad(degree))') 
    result <- python.get('result') 
    return(result) 
} 

Каждый раз, когда вы запускаете функцию R, вы будете импортировать целую библиотеку Python.

+0

Я смущен этой целым рядом вопросов. Я буквально никогда не использовал rPython, но просто просматривая документацию, я не совсем понимаю, почему вы просто не просто вызываете 'python.exec (« import numpy as np »)' внутри самой функции в первую очередь? – joran

+3

Это не смешно. «Импортировать всю библиотеку python» дважды не проблема. Большинство кодов python могут иметь 'import sys' в сотне мест. «Импорт» для каждой функции является хорошим примером «явный лучше, чем неявный». Или у вас есть R '.First' в вашем пакете, который импортирует все ваши библиотеки python, но тогда вы должны держать это в курсе, но это, вероятно, ложная оптимизация. – Spacedman

+0

@Spacedman Ну, если вы настаиваете. Python поддерживает внутренний список всех импортированных модулей. «Большинство кодов python могут импортировать sys в сотню мест». Но они этого не делают. Так же, как библиотеки R не загружаются с помощью R-функций, странно загружать библиотеки python в функции. Я бы подумал, что это также поразит вашу работу. Вторая идея, вероятно, лучше, чтобы использовать '.First' – ShanZhengYang

ответ

1

Как @Spacedman и @DirkEddelbuettel предлагает вам может добавить функцию .onLoad/.onAttach к пакету, который вызывает python.exec импортировать модули, как правило, всегда требуются пользователи пакета.

Вы могли бы также test whether the module has already been imported перед импортом, но (а), которая получает вас в немного проблемы регрессии, потому что вам нужно импортировать sys для того, чтобы выполнить тест, (б) ответы на этот вопрос позволяет предположить, что в в меньшей степени с точки зрения производительности, это не имеет значения, например

Если вы хотите оптимизировать, не импортируя вещи дважды, сохраните себя из-за проблем, потому что Python уже позаботится об этом.

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

+0

Спасибо за это! Некоторые упоминания о служебных расходах на этой странице, но я могу просто укусить пулю и записать ее в функцию R. Первоначально мотивация для этого вопроса заключалась в том, чтобы выяснить, что такое «стандарт», и я думаю, что мы это рассмотрели. Я ценю помощь! Спасибо! – ShanZhengYang