spsurvey::grts 需要具有 None 命名列表的 rpy2 实现

rpy2 implementation with None named list is required by spsurvey::grts

我有一个包含单个层的形状文件,我正在对其应用 a-survey::grts 方法。这在 R 中工作得很好,但是在 rpy2 中有一个 'None' 命名列表让我很困惑。

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 中具有 None 命名列表的解决方案!

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'))