【问题标题】:rpy2 implementation with None named list is required by spsurvey::grtsspsurvey::grts 需要使用无命名列表的 rpy2 实现
【发布时间】:2019-12-17 00:20:15
【问题描述】:

我有一个单层的形状文件,我正在应用 a-survey::grts 方法。这在 R 中工作得很好,但是在 rpy2 中有一个“无”命名列表让我感到困惑。

dsgn <- list(None=list(panel=c(Base=50), seltype="Equal"))

grts(design=dsgn,
     DesignID='newpts',
     type.frame='finite',
     src.frame='shapefile',
     in.shape=interest,
     att.frame=att,
     shapefile=TRUE,
     out.shape="newtest",
     prj=file.name)

需要注意的是 None 命名列表,它是一个 design requirement 有 1 层。当我将它放入 rpy2 时,问题就出现了,因为 python 是,好吧,python。

dsgn = robjects.r.list(None=robjects.r.listlist(panel=c(Base=50), seltype="Equal"))

这让我发现了语法错误:关键字不能是表达式。我理解为什么 python 告诉我这一点,但是我在 rpy2 文档中的任何地方都找不到解决方法,也找不到其他人遇到同样挑战的地方。我尝试了各种形式的 r.None、Null 等,并且完全摆脱了 None 层(这会导致只有 1 个层引起的错误)。为单个层条件创建解决方法或在 rpy2 中具有无命名列表的解决方案将非常受欢迎!

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    None 确实是 Python 中的保留字,但解决这个问题的方法很少。

    在下面的示例中,R 函数c 是:

    c = robjects.r.c
    

    1- 在 Python 中解决此问题的一般方法是使用 dict

    dsgn = robjects.r.list(**{'None': robjects.r.listlist(panel=c(Base=50),
                                                          seltype="Equal")})
    

    https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html#callable

    2-方法rcall

    dsgn = robjects.r.list.rcall(
        ('None', robjects.r.listlist(panel=c(Base=50), seltype="Equal"))),
        globalenv
    )
    

    https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html#rcall

    3- 包装函数

    make_dsgn = robjects.r('function(...) {list(None=list(...))}')
    dsgn = make_dsgn(panel=c(Base=50, seltype='Equal'))
    

    【讨论】:

    • 那些工作完美,我非常感谢出于学习目的而对文档的引用!我假设 1-dict 版本可能是最有效的,因为它是最“pythonic”的;根据您的经验,这是否属实?
    • dict 可以与任何 Python 函数或可调用对象一起使用。另外两个是 rpy2 特有的习语。
    猜你喜欢
    • 2021-12-25
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2018-09-30
    • 2023-03-07
    相关资源
    最近更新 更多