微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何定义一个使用 R 代码但从 rTorch 调用的 Python 类?

如何解决如何定义一个使用 R 代码但从 rTorch 调用的 Python 类?

我正在使用 rTorch(例如 https://f0nzie.github.io/rtorch-minimal-book/)。我想从 rTorch 中定义一个 DataSet 类。我可以用 py_run_file 做到这一点。但是,我希望这个 DataSet Class 使用 R 代码,因为在 tidyR 中数据准备对我来说更容易。在 Python 中,我为此使用 rpy2,当从 Python 内部调用时,它工作正常。

但是,当我从 rTorchreticulate 嵌入执行此操作时,它不起作用(R studio 崩溃;在命令行上我收到“R 已初始化”),可能是因为 R- ->Python-->R 有点循环(参见 https://github.com/rstudio/reticulate/issues/56)。 [但我认为 rpy2 可以打开另一个 R 会话实例?]

这是我认为的最小示例:

准备数据的 R 代码(在 prepDataSet.R 中):

library(tidyverse)
prepDataSetFunc <- function(parameter) {
df <- tibble(name=parameter,x=1:10,y=10:1)
df
### Of course the real function does much more ...
}

文件“PyClasses.py”中的Python代码

import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset,DataLoader
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
pandas2ri.activate()

ro.r('''source('prepDataSet.R')''')
prepFunc = ro.globalenv["prepDataSetFunc"]

class RDataSet(DataSet):
    def __init__(self,py_parameter):
        self.df = prepFunc(parameter=py_parameter)
    def __len__(self):
        return len(self.dfy.index)
        
    def __getitem__(self,i):
        return self.df.iloc[i:(i+1)].values.astype('float32')

完成所有 rTorch 工作的主要 R 代码

library(rTorch)
library(reticulate)
library(tidyverse)
library(magrittr)

reticulate::use_condaenv("mrTorchEnv") ## This was another problem,i.e. I Could not install rpy2 in rTorch environment,so I change the environment here

main <- py_run_file("PyClasses.py") ## This already fails

##### Then I want to do more stuff,i.e. DataLoader etc....

或者有什么方法可以从 rTorch 定义一个 PyTorch DataSet 类,然后使用 R 代码?或者通过字符串将R对象传递给Class???

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。