如何解决读入并将 Python 列表从 R 中转换为 R 向量 - Reticulate
我正在尝试使用 RStudio 中的 recticulate
读取 Python 列表对象并将其转换为 R 向量。根据 docs 的“在 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',Error: unexpected '[' in "py_to_r(["
> 'prtHrt_snRNAseq_Cer-Granule-1_SCZ_summary.tsv',Error: unexpected ',' in " 'prtHrt_snRNAseq_Cer-Granule-1_SCZ_summary.tsv',"
> 'prtHrt_snRNAseq_Cer-Granule-4_SCZ_summary.tsv',' in " 'prtHrt_snRNAseq_Cer-Granule-4_SCZ_summary.tsv',"
> 'prtHrt_snRNAseq_Cer-InN-Pro-2_SCZ_summary.tsv',' 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 直接解析扩展函数的输出一样。
这是蛇形规则:
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,"*","*_SCZ.rds > ",".csv"))
## Load and prep .rds file info -----------------------------------------------------
cat(paste0("Loading "," .rds file info ...\n"))
rds_file_df <- read_csv(paste0(OUT_DIR,".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
函数。我已经测试过了。
Tbh 我现在有的解决方法虽然很脏,但确实有效。我之前从未发布过蛇形规则等的原因是我希望最初问题的答案是微不足道的,因此问题的结构简洁。我想另一个选择是使用带有 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']]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。