从R - Reticulate中读取python列表并将其转换为R向量



我试图在RStudio中使用recticulate读取并将python列表对象转换为R向量。根据文档的"在R和Python之间转换"一节,使用py_to_r()函数这应该是一个相当简单的任务。

这是我的代码。

library(reticulate)
my_list <- py_to_r(['prtHrt_snRNAseq_Cer-CycPro_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Endo_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-ExN-Pro_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-1_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Granule-2_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Granule-3_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-4_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Granule-Pro_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-InN-Pro-1_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-InN-Pro-2_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-MG_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-N-undef-1_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-N-undef-2_SCZ_summary.tsv'], TRUE)

但是,当R无法解析这个数据结构时,

py_to_r(['prtHrt_snRNAseq_Cer-CycPro_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Endo_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-ExN-Pro_SCZ_summary.tsv', 
Error: unexpected '[' in "py_to_r(["
>                  'prtHrt_snRNAseq_Cer-Granule-1_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Granule-2_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Granule-3_SCZ_summary.tsv', 
Error: unexpected ',' in "                 'prtHrt_snRNAseq_Cer-Granule-1_SCZ_summary.tsv',"
>                  'prtHrt_snRNAseq_Cer-Granule-4_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-Granule-Pro_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-InN-Pro-1_SCZ_summary.tsv', 
Error: unexpected ',' in "                 'prtHrt_snRNAseq_Cer-Granule-4_SCZ_summary.tsv',"
>                  'prtHrt_snRNAseq_Cer-InN-Pro-2_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-MG_SCZ_summary.tsv', 'prtHrt_snRNAseq_Cer-N-undef-1_SCZ_summary.tsv', 
Error: unexpected ',' in "                 'prtHrt_snRNAseq_Cer-InN-Pro-2_SCZ_summary.tsv',"
>                  'prtHrt_snRNAseq_Cer-N-undef-2_SCZ_summary.tsv'])
Error: unexpected ']' in "                 'prtHrt_snRNAseq_Cer-N-undef-2_SCZ_summary.tsv']"

python列表来自一个蛇形规则的expand函数,我想把它输入到R脚本中。

是否有任何方法可以将这样的python列表结构转换为R对象,例如R中的向量?

任何帮助/想法/建议都将非常感谢。


根据@Dariober - 29/0721的要求进行更新


所以我有一个工作,我在R脚本中使用系统调用来创建一个.csv文件,其中包含扩展函数在snakemake中生成的文件列表。然后我将其读入R并处理它,就像我可以让R直接解析expand函数的输出一样。

下面是蛇形规则:

rule create_ldsc_group_plots:
# R produces 5 plots but only tracking the final plot here 
input:   expand(PART_HERIT_DIR + "prtHrt_snRNAseq_{CELL_TYPE}_SCZ.rds", CELL_TYPE = config["RNA_CELL_TYPES"])
output:  PART_HERIT_DIR + "Thal_ldsc_RNA_group_plot_lst.rds"
params:  out_dir = PART_HERIT_DIR 
message: "Creating ldsc group plots for all regions and SCZ GWAS"
log:     "logs/LDSR/snRNAseq.AllRegions.SCZ_partHerit.group.plots.log"
shell:
"""
export R_LIBS_USER=/R/library
module load libgit2/1.1.0
/apps/languages/R/4.0.3/el7/AVX512/gnu-8.1/bin/Rscript --vanilla 
scripts/R/scRNAseq_LDSC_create_group_plots.R {params.out_dir}  2> {log}

"""

下面是R代码的片段:

## Parse region / set region variable ---------------------------------------------------
cat('nParsing args ... n')
p <- arg_parser("Read out dir for LDSC RNA group plotting ... n")
p <- add_argument(p, "out_dir", help = "No out dir region provided")
args <- parse_args(p)
print(args)
##  Set variables  ----------------------------------------------------------------------
REGIONS <- c("Cer", "FC", "GE", "Hipp", "Thal")
OUT_DIR <- args$out_dir

for (REGION in REGIONS) {

plot_list <- list()

##  Create region specific .csv file  -------------------------------------------------
cat(paste0("nCreating ", REGION, " .csv file ...n"))   
system(paste0("ls ", OUT_DIR, "*", REGION, "*_SCZ.rds > ", OUT_DIR,  REGION, ".csv"))
##  Load and prep .rds file info  -----------------------------------------------------
cat(paste0("Loading ", REGION, " .rds file info ...n"))
rds_file_df <- read_csv(paste0(OUT_DIR, REGION, ".csv"), col_names = FALSE)
rds_file_vector <- pull(rds_file_df, X1) # pull equivalent to as.vector in dplyr

请注意,我正在通过argparser读取R脚本的参数。我尝试使用{input}作为R脚本的附加参数,但argparser想要单个输入,扩展列表中有91个文件名。还请注意,我需要在运行R脚本之前加载一个额外的模块,这意味着我需要在规则中使用shell指令而不是script,据我所知,我不能因此在R脚本中使用snakemake$input函数。我已经测试过了。

我现在的解决方法虽然很脏,但确实有效。我之前从未发布过蛇形规则等的原因是,我希望最初问题的答案是微不足道的,因此问题的结构是简约的。我猜另一个选择是使用一个带有R的虚拟环境和安装在其中的先决条件包,然后我可以运行script指令,但这对于旨在制作一些绘图的管道末端的规则来说可能有点多。

有没有一种简单的方法可以绕过这个问题,而我没有看到?

我猜问题是你给函数py_to_r不是python对象(你是从R内工作)。你可以尝试这样的东西:

tuple(
'prtHrt_snRNAseq_Cer-CycPro_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Endo_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-ExN-Pro_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-1_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-2_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-3_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-4_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-Granule-Pro_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-InN-Pro-1_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-InN-Pro-2_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-MG_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-N-undef-1_SCZ_summary.tsv', 
'prtHrt_snRNAseq_Cer-N-undef-2_SCZ_summary.tsv'
) %>% 
py_to_r()

显然这没有多大用处——你可以在不创建第一个python对象的情况下创建R对象。我认为函数py_to_r应该与返回python对象的python函数一起推测使用。

python列表来自蛇形规则的扩展函数,我想将其输入R脚本。

也许你把事情复杂化了。假设你有:

rule one:
input:
fin= expand('...'),
output:
out= ...
script:
'my-script.R'

然后在my-script.R中使用:

访问input.fin的文件列表
fin <- snakemake@input[['fin']]

最新更新