R和Python可以兼得吗?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"本文最初发布于towards data science网站,经原作者授权由InfoQ中文站翻译并分享。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"R和Python有很多相似之处,也有很多不同之处。两种语言的数据结构的大多数基础概念都非常相似,并且现在这两种语言都有许多数据科学包可用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但R的设计在我看来是“数据第一,应用第二”,而Python从一开始就给人感觉更多是应用程序开发驱动的。例如,纯粹从语法和环境管理的角度来看,Javascript程序员上手Python的速度要比上手R的速度快一些。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最近,我在工作中用到R和Python的次数越来越多,并且遇到了想要同时使用两者的情况。出现这种情况的原因有很多,但最常见的一个场景是你正在用R构建某些东西,同时需要自己或其他人之前用Python编写的功能。当然,你可以用R重写它,但这不是很DRY吗?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"R中的reticulate这个包让你可以在R会话中执行Python代码。它实际上已经出来几年了,并且一直在不断改进,所以我想写一个关于它具体用法的简短教程。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你是R的开发者,要启动和运行reticulate需要你了解一些Python的运行机制—以及它管理环境的典型做法—所以本教程可以帮助你更快地完成设置,这样就不用你自己去费劲研究了。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"R和Python中的环境"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"任何编程项目都运行在一个环境中,它在这个环境里存储和访问自己在执行过程中需要或创建的所有东西。在R中,所有项目都可以使用一个通用的全局环境,在这个环境里可以访问R基础语言和所有已安装的包。从这个意义上说,R中的所有项目通常都运行在相同的公共核心环境中。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"换一种方式来看待这个景象,你可以想象你家中所有成员的iPhone都共享同一个充电站;他们必须离开自己的房间给手机充电;如果他们出售自己的iPhone,买家需要自己解决充电问题。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但在Python中,每个项目通常都设置为完全自包含的—也就是说有自己的环境、自己的Python基础副本和它需要执行的所有模块的独立副本。你可以把这种景象想象成每个人在他们的房间里都有自己的iPhone充电器;他们不必走到外面找到统一的充电站来充电;如果他们出售手机,也会附上手机自己的充电器。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Python的这种模式在安装过程和磁盘\/内存资源消耗方面开销更大,但它能让开发者以最少的配置更轻松地在不同人之间转移项目。不难看出,它是直接从软件开发思维中发展出来的,这就是为什么我认为Python更像是“应用程序驱动的”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"这里我应该提一下,对于这两种语言的大多数日常用户来说,我所描述的是“典型的”场景。这些模式不是完全不变的,而且如果你知道该怎么做的话,在两种语言中都可以使用两种类型的项目流程。我们还看到R语言最近在朝着Python风格的环境管理模型迈进——例如renv包。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面是我画的一个小草图,它以简单的方式展示R和Python中常见环境机制之间的区别。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/01\/d7\/01311568feyy127cce32cb44dfdaf9d7.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"R和Python中的典型环境工作流"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在,如果你想让Python与R对话,前者仍然需要找到它自己的环境—你不能告诉它,让它去访问R的全局环境。这就像是让一个只会说英语的美国人去找一个只会说中文的中国人问路。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以,要让Python在你的R项目中跑起来,你需要做两件事:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"在R项目中设置一个Python环境,让Python可以认出自己的路。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"用于翻译Python代码以使其在R中工作的reticulate包。"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"设置Python环境"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"从现在开始我会使用一个简单的例子来做说明。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"假设我在RStudio中有一个R项目,它需要使用我用Python编写的函数。所以这里有一个简单的函数,我将它保存在我的R项目目录test_python中的一个名为light_years.py的Python脚本中(是的,RStudio允许你创建Python脚本!)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"这个函数接收公里或英里为单位的距离作为输入,并计算以光速行进这段距离需要多少年。换句话说,以光年为单位的距离是多少。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"from scipy.constants import cdef light_years(dist, unit = \"km\"):\n \n c_per_year = c * 60 * 60 * 24 * 365.25\n \n if unit == \"km\":\n \n dist_meters = dist * 1000\n \n elif unit == \"mi\":\n \n dist_meters = dist * 1.60934 * 1000\n \n else:\n \n sys.exit(\"Cannot use that unit!\")\n \n \n return dist_meters\/c_per_year\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我在这里使用了一个非常简单的函数示例,以免让这篇文章太过冗长。所以它有点不切实际,也有点蠢,因为我导入整个scipy包只是为了获取一个常量的值,但希望它能帮助你领会我的意思。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在正像我们上面所讨论的,我们需要为这段代码提供一个环境。它需要:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"要使用的Python版本"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"访问scipy包,从而可以获得常数c=光速"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"为你的R项目设置一个Python环境并不难。鉴于项目环境在Python中的重要性,市面上存在许多易用的环境管理工具。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我最喜欢的是Anaconda。它有两个版本可用。完整版包含环境可能需要的所有一大堆东西,包括所有最常用的Python模块。然后是Miniconda,它占用的磁盘空间少很多,更适合条件有限的Python用户。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可以在"},{"type":"link","attrs":{"href":"https:\/\/docs.conda.io\/en\/latest\/miniconda.html","title":"","type":null},"content":[{"type":"text","text":"此处"}]},{"type":"text","text":":"},{"type":"link","attrs":{"href":"https:\/\/docs.conda.io\/en\/latest\/miniconda.html","title":"","type":null},"content":[{"type":"text","text":"https:\/\/docs.conda.io\/en\/latest\/miniconda.html"}]},{"type":"text","text":"获取适用于你操作系统的Miniconda。请为要使用的Python版本下载对应的Conda。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"安装完Conda后,如果你使用的是macOS或Linux,通常会使用命令行来设置环境。只需转到终端中你的R项目目录(在我的例子中是test_python)并使用以下命令:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"conda create --name test_python\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"就这么简单,你现在已经创建了一个python环境。我通常将我的环境命名为与项目文件夹相同的名称,以免将来混淆。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在你需要告诉Conda,让它为这个项目使用这个环境。当你仍在命令行的test_python目录中时,使用以下命令:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"conda activate test_python\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在你已将此项目链接到了Python环境,并且其中有Python基础的一个副本供你的代码运行使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最后,我们的函数需要scipy包,所以我们需要把它放在环境中。只需在激活的项目文件夹中输入以下内容即可:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"conda install scipy\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然后,Conda会将scipy及它认为可能需要的所有依赖项安装到你的活动环境中,你就可以开始使用了——可以这么说,就像scipy一样简单。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"稍后你需要告诉R,在这个环境中在哪里可以找到Python。用这条命令可以获得所有环境的列表以及安装环境的路径:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"conda info --envs\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如,这能告诉我,我的环境安装在\/Users\/keithmcnulty\/opt\/miniconda3\/envs\/test_python。我总能在bin子目录中找到Python可执行文件——所以我的项目的Python可执行文件的完整路径是\/Users\/keithmcnulty\/opt\/miniconda3\/envs\/test_python\/bin\/python3,因为我使用的是Python 3。我们需要告诉R的就是这些,这样它就知道在哪里可以找到Python环境了。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"在R中运行你的Python函数"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在,无论你是像我一样用Conda设置了Python环境,还是使用了virtualenv,你都已经完成了最艰巨的部分。剩下的操作很简单,因为reticulate会接手。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,当R加载项目时,你需要告诉R,在正确的环境中在哪里可以找到Python可执行文件。为此,请启动一个空文本文件并添加以下内容,将我的路径替换为与你创建的项目环境中的Python可执行文件匹配的路径。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"Sys.setenv(RETICULATE_PYTHON = \"\/Users\/keithmcnulty\/opt\/miniconda3\/envs\/test_python\/bin\/python3\")\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在将这个文本文件保存在你的项目目录中,名称为.Renv。这是一个隐藏文件,每当你在RStudio中启动项目时,R都会执行该文件。所以现在关闭RStudio并在打开test_python项目的同时重新启动它,它现在将指向Python环境。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你还没有安装reticulate R包,你应该在这个时候安装。安装后,你可以在终端中尝试一些测试,看看是否一切正常。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,你可以测试R是否知道Python在哪里。reticulate::py_available()应该返回“TRUE”。你还可以测试项目是否安装了你需要的Python模块:reticulate::py_module_available(\"scipy\")应返回“TRUE”。假设一切正常,你已准备好将你的函数引入R了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可以使用简单的一条命令来获取Python脚本:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"reticulate::source_python(\"light_years.py\")\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"现在你可以将light_years()函数用作R函数。让我们看看以光速行驶一千万英里需要多少年:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"> light_years(1000000000000000, \"mi\")\n[1] 170.1074\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很好!显然,这是一个非常简单的示例,但它确实告诉了你关于如何将Python代码集成到R脚本中的所有信息。你现在可以自由引入目前仅支持Python的各种功能或包,并让它们在R中工作,这非常令人兴奋。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你想查看一些高级示例,进一步了解如何使用reticulate将Python和R结合在一起使用,请查看我最近的几篇文章:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/five-ways-to-work-seamlessly-between-r-and-python-in-the-same-project-bf173e35fdef","title":"","type":null},"content":[{"type":"text","text":"在同一项目中无缝切换R和Python的五种方法"}]},{"type":"text","text":":"},{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/five-ways-to-work-seamlessly-between-r-and-python-in-the-same-project-bf173e35fdef","title":"","type":null},"content":[{"type":"text","text":"https:\/\/towardsdatascience.com\/five-ways-to-work-seamlessly-between-r-and-python-in-the-same-project-bf173e35fdef"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/generating-parameterized-powerpoint-documents-in-python-and-r-333368479038","title":"","type":null},"content":[{"type":"text","text":"生成参数化Powerpoint文档"}]},{"type":"text","text":":"},{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/generating-parameterized-powerpoint-documents-in-python-and-r-333368479038","title":"","type":null},"content":[{"type":"text","text":"https:\/\/towardsdatascience.com\/generating-parameterized-powerpoint-documents-in-python-and-r-333368479038"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/how-to-run-python-ml-algorithms-easily-in-r-7e3b0f7c7aee","title":"","type":null},"content":[{"type":"text","text":"在R中运行XGBoost"}]},{"type":"text","text":":"},{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/how-to-run-python-ml-algorithms-easily-in-r-7e3b0f7c7aee","title":"","type":null},"content":[{"type":"text","text":"https:\/\/towardsdatascience.com\/how-to-run-python-ml-algorithms-easily-in-r-7e3b0f7c7aee"}]}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"作者介绍"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一开始我是一名纯数学家,然后我成为了心理咨询师和数据科学家。我很喜欢将所有这些学科的严谨思想应用在复杂的人性问题上。我也是一位编码极客,还是日本RPG的忠实粉丝。可以在"},{"type":"link","attrs":{"href":"https:\/\/www.linkedin.com\/in\/keith-mcnulty\/","title":"","type":null},"content":[{"type":"text","text":"LinkedIn"}]},{"type":"text","text":"或"},{"type":"link","attrs":{"href":"https:\/\/twitter.com\/dr_keithmcnulty","title":"","type":null},"content":[{"type":"text","text":"Twitter"}]},{"type":"text","text":"上找到我。还可以查看我在drkeithmcnulty.com上的博客或我即将发布的关于人类分析的"},{"type":"link","attrs":{"href":"https:\/\/www.routledge.com\/Handbook-of-Regression-Modeling-in-People-Analytics-With-Examples-in-R\/McNulty\/p\/book\/9781032041742","title":"","type":null},"content":[{"type":"text","text":"教科书"}]},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文链接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/towardsdatascience.com\/why-choose-between-r-and-python-b12bf409d0d0","title":"","type":null},"content":[{"type":"text","text":"https:\/\/towardsdatascience.com\/why-choose-between-r-and-python-b12bf409d0d0"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章