首页 > 解决方案 > 是否可以在 R 脚本中集成 python 函数?

问题描述

我已经定义了一个 python 函数,我想将它集成到 R 中,这可能吗?

这是我要集成的python代码:

def set_priority_py(overlap,Priority,IEC_category):
    import pandas as pd
    import numpy as np
    import math as m

    #priority = (3,2,1,4,5,6,7)
    #category = ("a","b","c","d","e","f","g")
    #overlap = (float('NaN'),1,1,1,0,1,1)
    priority = Priority
    category = IEC_category
    #overlap = overlap

    data = pd.DataFrame({'priority':priority,'category':category,'overlap':overlap})

    data['new'] = np.nan
    data['new2'] = np.nan
    #rest = []
    data['rest'] = ""
    for i in range(1, len(data)):
        if data.overlap.loc[i] == True:
            if data.priority.loc[i]<= (data.priority.loc[i-1] if m.isnan(data.new.loc[i-1]) else data.new.loc[i-1]):
                data.new.loc[i] = data.priority.loc[i]
                data.new2.loc[i] = data.category.loc[i]
                #rest.append(data.category[i-1])
                #data.rest[i] = rest
                data.rest.loc[i] = ''.join([str(data.rest.loc[i-1]),',',str(data.category.loc[i-1])])
            else:
                data.new.loc[i] = data.priority.loc[i-1]
                data.new2.loc[i] = data.category.loc[i-1]
                #rest.append(data.category[i])
                #data.rest[i] = rest
                data.rest.loc[i] = ''.join([str(data.rest.loc[i-1]),',',str(data.category.loc[i])])
    data.rest = data.rest.str[1:]
    return data

随机数据帧的结果是:

priority    category    overlap new new2    rest
0   3   a   NaN NaN NaN 
1   2   b   1.0 2.0 b   a
2   1   c   1.0 1.0 c   a,b
3   4   d   1.0 1.0 c   a,b,d
4   5   e   0.0 NaN NaN 
5   6   f   1.0 5.0 e   f
6   7   g   1.0 6.0 f   f,g

是否可以创建一个在 R 中工作的函数?我试图将它与“网状”包集成,但我的程序崩溃了。

这是代码,当我执行第二行 RStudio 崩溃时。

  source_python("set_priority_py.py")
  set_priority(overlap,Priority,IEC_category)

编辑

该代码适用于本示例中创建的 20 个随机样本:

  overlap <- as.logical(sample(c(0,1),size=20, replace = TRUE))
  Priority<- sample(c(0,1,2,3,4,5,6,7),size=20, replace = TRUE)
  IEC_category<-sample(c("a","b","c","d","e","f","g","h"),size=20, replace = TRUE)
  source_python("set_priority_py.py")
  set_priority(overlap,Priority,IEC_category)

标签: pythonr

解决方案


R的reticulate包应该可以解决您的问题。

您可以创建一个 python 脚本文件,例如调用它useful_function.py并包含在其中

def useful_function(x):
    return x *2

然后在 R 中,您可以简单地将函数加载到您的工作区

library(reticulate)
use_python("/path/to/your/python/interpreter")

# source the created python script
source_python("useful_function.py")

result <- useful_function(2)
print(result)

如果您在使用 reticulate 和您的代码时遇到其他问题,您可以在此处发布错误消息,以便我们更好地帮助您。


推荐阅读