rpy2 RRuntimeError:代表错误:无效的“时间”参数

问题描述

我正在使用 rpy2 在 Python 中运行 R 包。函数 rMBC.MBCn 最初使用矩阵作为输入,在本例中为 obs_datmod_datmod_nf 参数。为了对多维数据运行该函数,我在 Python 中使用 xarray.apply_ufuncrMBC.MBCn 函数进行矢量化。但是,当我运行下面的脚本时,它导致了 rep 中的运行时错误。我不太确定是什么导致了这个错误。我认为这可能是因为数据的结构与 R 中的原始输入完全不同?由于数据的形状,变量并没有完全被读取为“列”?此外,在 R 脚本 rep(trace.calc,ncol(o.c)) 中,o.c 在这种情况下是 obs_dat

这是我用于 obs_dat 的输入的描述(它类似于 mod_datproj_dat)它包含 2 个具有 3 个维度的变量每个:

        <xarray.Dataset>
        Dimensions:    (latitude: 101,longitude: 101,time: 240)
        Coordinates:
          * time       (time) datetime64[ns] 1986-01-16T11:00:00 ... 2005-12-16T11:00:00
          * longitude  (longitude) float32 110.0 110.25 110.5 ... 134.5 134.75 135.0
          * latitude   (latitude) float32 25.0 24.75 24.5 24.25 ... 0.75 0.5 0.25 0.0
        Data variables:
            rsns       (time,latitude,longitude) float32 102.40908 ... 186.72174
            tas        (time,longitude) float32 9.834406 ... 27.176416
        Attributes:
            CDI:          climate Data Interface version 1.9.6 (http://mpimet.mpg.de/...
            Conventions:  CF-1.6
            history:      Wed Feb 24 14:45:36 2021: cdo merge ../OBS/ERA5_ssr_1986-20...
            frequency:    mon
            CDO:          climate Data Operators version 1.9.6 (http://mpimet.mpg.de/...

这是我使用 rpy2xarrayrMBC.MBCn 运行的脚本以及随后出现的错误

    import xarray as xr
    import numpy as np
    from rpy2.robjects import pandas2ri
    from rpy2.robjects.packages import importr
    
    pandas2ri.activate()
    rMBC = importr("MBC")
    
    def MBCn_hist(obs_dat,mod_dat,mod_nf):
        mbc = rMBC.MBCn(obs_dat,mod_nf,2,qmap_precalc=False,ratio_seq=np.repeat(False,2))[0]
        return(mbc)
    
    hist2 = xr.apply_ufunc(MBCn_hist,obs.drop('time'),hist.drop('time'),proj.drop('time'),input_core_dims=[['time'],['time'],['time']],output_core_dims=[['time']],vectorize=True,dask='parallelized')

RRuntimeError: Error in rep(trace.calc,ncol(o.c)) : invalid 'times' argument

解决方法

对于 rpy2,RRuntimeError 类型的异常是 R 错误(导致 R 在代码评估期间停止的错误)。这似乎是在调用 rMBC.MBCn() 时。错误消息本身来自 R 代码(在这种情况下是 R 库 MBC)。

我建议您首先尝试在没有 xarray 的情况下进行呼叫(使用数据的子集)。这样做的原因是:

  • 这将使检查 PythonR 转换发生的情况更容易(并在需要时对其进行微调)
  • 需要谨慎处理并行化。 R 在很大程度上无法处理多线程,并且多处理有时需要一些注意(R 共享 C 库使用全局变量来存储状态和调用堆栈等内容 - 取决于子进程的创建方式,它们之间的共享可能比需要)。

此外,不鼓励使用 pandas2ri.activate()(并且已弃用)。改用本地转换器。

rpy2 文档有关于上述内容的更多详细信息或示例。