R和Python可以兼得嗎?

2021-12-09 AI前線

本文最初發布於 towards data science 網站,經原作者授權由 InfoQ 中文站翻譯並分享。

R 和 Python 有很多相似之處,也有很多不同之處。兩種語言的數據結構的大多數基礎概念都非常相似,並且現在這兩種語言都有許多數據科學包可用。

但 R 的設計在我看來是「數據第一,應用第二」,而 Python 從一開始就給人感覺更多是應用程式開發驅動的。例如,純粹從語法和環境管理的角度來看,Javascript 程式設計師上手 Python 的速度要比上手 R 的速度快一些。

最近,我在工作中用到 R 和 Python 的次數越來越多,並且遇到了想要同時使用兩者的情況。出現這種情況的原因有很多,但最常見的一個場景是你正在用 R 構建某些東西,同時需要自己或其他人之前用 Python 編寫的功能。當然,你可以用 R 重寫它,但這不是很 DRY 嗎?

R 中的 reticulate 這個包讓你可以在 R 會話中執行 Python 代碼。它實際上已經出來幾年了,並且一直在不斷改進,所以我想寫一個關於它具體用法的簡短教程。

如果你是 R 的開發者,要啟動和運行 reticulate 需要你了解一些 Python 的運行機制—以及它管理環境的典型做法—所以本教程可以幫助你更快地完成設置,這樣就不用你自己去費勁研究了。

任何編程項目都運行在一個環境中,它在這個環境裡存儲和訪問自己在執行過程中需要或創建的所有東西。在 R 中,所有項目都可以使用一個通用的全局環境,在這個環境裡可以訪問 R 基礎語言和所有已安裝的包。從這個意義上說,R 中的所有項目通常都運行在相同的公共核心環境中。

換一種方式來看待這個景象,你可以想像你家中所有成員的 iPhone 都共享同一個充電站;他們必須離開自己的房間給手機充電;如果他們出售自己的 iPhone,買家需要自己解決充電問題。

但在 Python 中,每個項目通常都設置為完全自包含的—也就是說有自己的環境、自己的 Python 基礎副本和它需要執行的所有模塊的獨立副本。你可以把這種景象想像成每個人在他們的房間裡都有自己的 iPhone 充電器;他們不必走到外面找到統一的充電站來充電;如果他們出售手機,也會附上手機自己的充電器。

Python 的這種模式在安裝過程和磁碟 / 內存資源消耗方面開銷更大,但它能讓開發者以最少的配置更輕鬆地在不同人之間轉移項目。不難看出,它是直接從軟體開發思維中發展出來的,這就是為什麼我認為 Python 更像是「應用程式驅動的」。

這裡我應該提一下,對於這兩種語言的大多數日常用戶來說,我所描述的是「典型的」場景。這些模式不是完全不變的,而且如果你知道該怎麼做的話,在兩種語言中都可以使用兩種類型的項目流程。我們還看到 R 語言最近在朝著 Python 風格的環境管理模型邁進——例如 renv 包。

下面是我畫的一個小草圖,它以簡單的方式展示 R 和 Python 中常見環境機制之間的區別。 

R 和 Python 中的典型環境工作流

現在,如果你想讓 Python 與 R 對話,前者仍然需要找到它自己的環境—你不能告訴它,讓它去訪問 R 的全局環境。這就像是讓一個只會說英語的美國人去找一個只會說中文的中國人問路。

所以,要讓 Python 在你的 R 項目中跑起來,你需要做兩件事:

在 R 項目中設置一個 Python 環境,讓 Python 可以認出自己的路。

用於翻譯 Python 代碼以使其在 R 中工作的 reticulate 包。

從現在開始我會使用一個簡單的例子來做說明。

假設我在 RStudio 中有一個 R 項目,它需要使用我用 Python 編寫的函數。所以這裡有一個簡單的函數,我將它保存在我的 R 項目目錄 test_python 中的一個名為 light_years.py 的 Python 腳本中(是的,RStudio 允許你創建 Python 腳本!)。

這個函數接收公裡或英裡為單位的距離作為輸入,並計算以光速行進這段距離需要多少年。換句話說,以光年為單位的距離是多少。

from scipy.constants import cdef light_years(dist, unit = "km"):

c_per_year = c * 60 * 60 * 24 * 365.25

if unit == "km":

dist_meters = dist * 1000

elif unit == "mi":

dist_meters = dist * 1.60934 * 1000

else:

sys.exit("Cannot use that unit!")


return dist_meters/c_per_year

我在這裡使用了一個非常簡單的函數示例,以免讓這篇文章太過冗長。所以它有點不切實際,也有點蠢,因為我導入整個 scipy 包只是為了獲取一個常量的值,但希望它能幫助你領會我的意思。

現在正像我們上面所討論的,我們需要為這段代碼提供一個環境。它需要:

要使用的 Python 版本

訪問 scipy 包,從而可以獲得常數 c= 光速

為你的 R 項目設置一個 Python 環境並不難。鑑於項目環境在 Python 中的重要性,市面上存在許多易用的環境管理工具。

我最喜歡的是 Anaconda。它有兩個版本可用。完整版包含環境可能需要的所有一大堆東西,包括所有最常用的 Python 模塊。然後是 Miniconda,它佔用的磁碟空間少很多,更適合條件有限的 Python 用戶。

你可以在 此處:https://docs.conda.io/en/latest/miniconda.html 獲取適用於你作業系統的 Miniconda。請為要使用的 Python 版本下載對應的 Conda。

安裝完 Conda 後,如果你使用的是 macOS 或 Linux,通常會使用命令行來設置環境。只需轉到終端中你的 R 項目目錄(在我的例子中是 test_python)並使用以下命令:

conda create --name test_python

就這麼簡單,你現在已經創建了一個 python 環境。我通常將我的環境命名為與項目文件夾相同的名稱,以免將來混淆。

現在你需要告訴 Conda,讓它為這個項目使用這個環境。當你仍在命令行的 test_python 目錄中時,使用以下命令:

conda activate test_python

現在你已將此項目連結到了 Python 環境,並且其中有 Python 基礎的一個副本供你的代碼運行使用。

最後,我們的函數需要 scipy 包,所以我們需要把它放在環境中。只需在激活的項目文件夾中輸入以下內容即可:

conda install scipy

然後,Conda 會將 scipy 及它認為可能需要的所有依賴項安裝到你的活動環境中,你就可以開始使用了——可以這麼說,就像 scipy 一樣簡單。

稍後你需要告訴 R,在這個環境中在哪裡可以找到 Python。用這條命令可以獲得所有環境的列表以及安裝環境的路徑:

conda info --envs

例如,這能告訴我,我的環境安裝在 /Users/keithmcnulty/opt/miniconda3/envs/test_python。我總能在 bin 子目錄中找到 Python 可執行文件——所以我的項目的 Python 可執行文件的完整路徑是 /Users/keithmcnulty/opt/miniconda3/envs/test_python/bin/python3,因為我使用的是 Python 3。我們需要告訴 R 的就是這些,這樣它就知道在哪裡可以找到 Python 環境了。

現在,無論你是像我一樣用 Conda 設置了 Python 環境,還是使用了 virtualenv,你都已經完成了最艱巨的部分。剩下的操作很簡單,因為 reticulate 會接手。

首先,當 R 加載項目時,你需要告訴 R,在正確的環境中在哪裡可以找到 Python 可執行文件。為此,請啟動一個空文本文件並添加以下內容,將我的路徑替換為與你創建的項目環境中的 Python 可執行文件匹配的路徑。

Sys.setenv(RETICULATE_PYTHON = "/Users/keithmcnulty/opt/miniconda3/envs/test_python/bin/python3")

現在將這個文本文件保存在你的項目目錄中,名稱為.Renv。這是一個隱藏文件,每當你在 RStudio 中啟動項目時,R 都會執行該文件。所以現在關閉 RStudio 並在打開 test_python 項目的同時重新啟動它,它現在將指向 Python 環境。

如果你還沒有安裝 reticulate R 包,你應該在這個時候安裝。安裝後,你可以在終端中嘗試一些測試,看看是否一切正常。

首先,你可以測試 R 是否知道 Python 在哪裡。reticulate::py_available() 應該返回「TRUE」。你還可以測試項目是否安裝了你需要的 Python 模塊:reticulate::py_module_available("scipy") 應返回「TRUE」。假設一切正常,你已準備好將你的函數引入 R 了。

你可以使用簡單的一條命令來獲取 Python 腳本:

reticulate::source_python("light_years.py")

現在你可以將 light_years() 函數用作 R 函數。讓我們看看以光速行駛一千萬英裡需要多少年:

> light_years(1000000000000000, "mi")
[1] 170.1074

很好!顯然,這是一個非常簡單的示例,但它確實告訴了你關於如何將 Python 代碼集成到 R 腳本中的所有信息。你現在可以自由引入目前僅支持 Python 的各種功能或包,並讓它們在 R 中工作,這非常令人興奮。

如果你想查看一些高級示例,進一步了解如何使用 reticulate 將 Python 和 R 結合在一起使用,請查看我最近的幾篇文章:

在同一項目中無縫切換 R 和 Python 的五種方法:https://towardsdatascience.com/five-ways-to-work-seamlessly-between-r-and-python-in-the-same-project-bf173e35fdef

生成參數化 Powerpoint 文檔:https://towardsdatascience.com/generating-parameterized-powerpoint-documents-in-python-and-r-333368479038

在 R 中運行 XGBoost:https://towardsdatascience.com/how-to-run-python-ml-algorithms-easily-in-r-7e3b0f7c7aee

一開始我是一名純數學家,然後我成為了心理諮詢師和數據科學家。我很喜歡將所有這些學科的嚴謹思想應用在複雜的人性問題上。我也是一位編碼極客,還是日本 RPG 的忠實粉絲。可以在 LinkedIn 或 Twitter 上找到我。還可以查看我在 drkeithmcnulty.com 上的博客或我即將發布的關於人類分析的 教科書。

原文連結:

https://towardsdatascience.com/why-choose-between-r-and-python-b12bf409d0d0

你也「在看」嗎?👇

相關焦點

  • R 和 Python,為什麼不能二者兼得?
    你說想同時使用 R 和 Python?prython 就可以滿足你的願望!你是否同時使用 R 和 Python,或者是在不同的項目中,或者是在同一個項目中?請看一看 prython,一個專門為滿足你這種需求而設計的 IDE。忘掉 R 與 Python 之間的網絡論戰吧。如果 R 和 Python 都被使用可能是合理的時候,那麼在實際情況中會發生什麼情況呢?
  • 用R也可以跑Python了
    通過安裝包,你現在可以在R上運行Python的安裝包和函數了~今天文摘菌就來教教你咋用這個reticulate包。」)第二步:在conda環境下安裝「r-reticulate」和「numpy」;conda_install(「r-reticulate」,「numpy」)
  • 用R也可以跑Python了
    r-reticulate」)第二步:在conda環境下安裝「r-reticulate」和「numpy」;conda_install(「r-reticulate」,「numpy」)如果「numpy」已經安裝,您不必再次安裝這個包。
  • 未來,不是【Python vs R】,而是【Python and R】
    最具代表性的是Wickham(R領袖)和 McKinney (Python領袖)都在主張這兩種語言的融合式發展。用Wickham的話講,未來,不是「Python vs R」,而是「Python and R」。例如,2018年,McKinney的Ursa Labs宣布——即將與Wickham 的RStudio合作,致力於改進R和Python語言本身及其用戶體驗。
  • rPython:在R語言中調用python命令
    經常使用Python和R語言的人都知道,如果R中有某些功能Python不容易實現時,則可以安裝加載rpy2包,從而實現在python中調用R語言命令的功能
  • R 和 Python 中的文本挖掘:8 個入門小貼士
    David Robinson 的博客:http://varianceexplained.org/r/trump-tweets/South Park dialoguehttp://kaylinwalker.com/text-mining-south-park/film dialoguehttps://pudding.cool
  • 如何讓R與Python一起工作 | 案例講解
    關於rpy2.robjects是rpy2對R的一個高級封裝,該模塊裡包含了一個R對象和一系列的R數據結構。使用rpy2的大多數情況,只需要跟這個模塊打交道即可。rpy2的安裝在此不多講了,直接體驗一下R如何與Python無縫整合吧。R實例是指rpy2.robjects.R,它是在Python中的嵌入式R進程,把R當作從python走向R的通道來看就可以了。
  • 教你在同一個項目中,讓R和Python無縫工作的5種方法
    Python在某些方面做得最好,R在某些方面做得最好,因此,如果我們在需要的時候可以同時使用這兩種方法,那麼我們就可以發揮出最好的性能。在最近的示例中,我想創建一個Shiny應用程式來生成參數化的Powerpoint文檔,這個應用我是用R的tidyverse對我的數據進行編碼處理,使用Python編寫了Powerpoint編輯代碼,因為這在python-pptx包中很容易。
  • 如何在 Rstudio 中使用 python 語言 (圖文詳解)
    這是pycharm的界面 ↑↑↑那經典的 Rstudio呢?之前看到Y叔提到 好用的Python IDE 是 Rstudio,順勢搜索一番發現,有點意思。熟悉的界面熟悉的界面,直接在新建中選擇 Python Script即可。
  • R語言和Python語言在數據科學方面的比較:當今進展的總結
    最近,一些讀者向我們詢問在數據科學方面最好的程式語言,R和Python立刻浮現在了我的腦海裡。那麼,如何在這兩大巨頭之間做出選擇呢?我們最近觀看了一個出色的視頻,圍繞著這兩種語言的近期進展,正好可以解決這個問題。該視頻來自Domino數據實驗室的首席數據科學家——Eduardo Ariño de la Rubias。
  • R和Python對比(8) :循環結構
    while 判斷條件:執行語句需要注意冒號和縮進;for 循環可以遍歷任何可迭代對象;break 語句可跳出 for 和 while 的循環體。如果從 for 或 while 循環中終止,任何對應的循環 else 塊將不執行;continue 語句被用來跳過當前循環塊中的剩餘語句,然後繼續進行下一輪循環。
  • 數據科學探索(python 與 R 的比較)
    R1 數據科學探索(python 與 R 的比較)        首次嘗試使用jupyter notebook來實現python 和 R,感覺在R的部分兼容性方面還是與rmarkdown有些差距。如何在jupyter中跑R 可以查看[Jupyter and conda for R](http://www.tuicool.com/articles/nuaiEnF) 這篇文章.    我們分別從數據科學的主要流程來討論Python與R 的數據實現。
  • python 學習之 R and Python: 循環函數
    1引言我們看看在 R 裡和 Python 裡這些 lapply,apply,mapply,tapply,split, 函數的不同實現方式。Python 裡是沒有這類函數的, 除了 apply ,但也可以實現類似的方法。
  • 特徵工程總結:R與python的比較實現
    文前提要本期你主要學習到如下內容:特徵工程概述特徵選擇的一般步驟特徵工程的主要包含的內容框架特徵選擇的主要方法和python
  • 搞機器學習,Python 和 R 哪個更合適?
    R則作為一門用於事實推斷和統計推斷的語言在數據分析領域享有盛譽。這並不意味著必須把這兩個語言劃分到不同的領域 ——python也足以被用來作為數據分析的工具,R也具備充分的適應性可以完成機器學習中的重要工作。這兩種語言各自有大量的庫試圖去完成對方的功能。Python具有可以提升其顯著推斷能力的庫,R也有提升其預測精度的庫。
  • 【Python基礎】python使用PyPDF2和pdfplumber操作pdf
    1、PyPDF2和pdfplumber庫介紹PyPDF2官網:PyPDF2官網 ,可以更好的讀取、寫入、分割、合併PDF文件;pdfplumber官網:pdfplumber官網,可以更好地讀取PDF文件內容和提取PDF中的表格;這兩個庫不屬於python標準庫,都需要單獨安裝;2、python提取PDF文字內容1)利用pdfplumber提取文字
  • 【Python基礎】python使用python-docx操作word
    1、python-docx庫介紹該模塊兒可以創建、修改Word(.docx)文件;python-docx使用官網:python-docx官網我們在安裝此模塊兒使用的是pip install python-docx,但是在導入的時候是import docx;2、Python讀取Word文檔內容注意:每進行一個操作,必須保存一下,否則等於白做;1)word文檔結構介紹在這裡插入圖片描述2)python-docx
  • python自動化辦公系列 | python操作pdf—— PyPDF2 和 pdfplumber模塊(2)
    第一個的系統化的分享專題——python辦公自動化。代碼後面的#所表示的是注釋,對本行代碼進行解釋的內容,用#號開頭是讓程序理解這是注釋不需要運行的意思。本模板旨在分享和解讀完整代碼,只要你有安裝配置好python環境,在pycharm裡安裝相應的第三方文件庫,黏貼代碼即可運行,我會儘量在代碼後面都進行標註解讀。我們以實用型為目的學習。編程類學習,從模仿中掌握突破。
  • 使用 R 與 python 進行 t 檢驗
    下面的內容我們就用胡謅的例子和數據來演示相關的分析。(當然可以使用正態分布的隨機數,但是那樣有點太假了,我儘量把數據造的接近真實點,造數據,也要專業!)那如果我們的備擇假設是該藥品不合格,低於 0.7,會有差別嗎?
  • Python輸入,輸出,存儲器和異常
    輸入/輸出程序與用戶的交互需要使用輸入/輸出,主要包括控制臺和文件;對於控制臺可以使用input和print。input(xxx)輸入xxx, 然後讀取用戶的輸入並返回。In [1]: input()1Out[1]: '1'文件輸入/輸出可以使用file類打開一個文件,使用file的read、readline和write來恰當的讀寫文件。對文件讀寫能力取決於打開文件時使用的模式, 常用模式讀模式("r")寫模式("w")追加模式("a")文件操作之後需要調用close方法來關閉文件。