【问题标题】:Read in and convert a python list to R vector from within R - Reticulate读入并从 R 中将 python 列表转换为 R 向量 - Reticulate
【发布时间】:2021-10-03 04:10:03
【问题描述】:

我正在尝试使用 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', '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 列表来自我想输入到 R 脚本中的蛇形规则的 expand 函数。

有没有什么办法可以在 R 中将诸如此类的 python 列表结构转换为 R 对象,例如向量?

任何帮助/想法/建议将不胜感激。


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


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

这是snakemake规则:

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代码的sn-p:

## 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 函数。我已经测试过了。

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

有没有一种我没有看到的简单方法来解决这个问题?

【问题讨论】:

    标签: r list type-conversion snakemake reticulate


    【解决方案1】:

    我想问题是你给函数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函数一起使用。

    【讨论】:

    • 感谢您的建议,我有一个类似的解决方法,可以在 R 中使用 system() 命令格式化列表,但我希望有更清晰的内容,并想知道 R 是否可以直接解析 python 列表。跨度>
    【解决方案2】:

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

    也许你让事情变得比必要的复杂。假设你有:

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

    然后在my-script.R 中访问文件列表input.fin

    fin <- snakemake@input[['fin']]
    

    【讨论】:

    • 我一直在尝试使用argparser 做类似的事情,因为我使用的是shell 而不是script(我需要在运行R 脚本之前在slurm 上加载模块)。我不确定是否可以将snakemake@input 选项与shell 命令一起使用,可以吗?更新:刚试了一下说没找到snakemake!
    • @Darren 编辑您的问题以显示您正在尝试做什么。例如。显示导致问题的蛇形规则。
    猜你喜欢
    • 2012-07-17
    • 2013-06-08
    • 2013-08-03
    • 2018-12-08
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多