R:从函数调用中识别向量和数据帧名称

Dom*_*ois 0 regex r function-calls

说我有一个功能my.function回吐x,数字载体,作为其唯一参数.我需要以match.call()$x这样的方式分解或解析字符串,以便我可以识别:

  • 矢量的名称和标签(如果有的话)
  • 它所在的结构,如果有的话(数据框,列表等).
  • 这个最新结构的结构......等等.

换句话说,我需要从函数调用中扣除数据的层次结构.例如,假设函数调用是

> my.function(iris$Species)
Run Code Online (Sandbox Code Playgroud)

strsplit或正则表达式将告诉我们Species是一个原子向量,包含在一个名为iris的数据帧中.(is.vector,is.data.frame以及其他可用于验证这一点).事情变得更复杂,尽管结构是更大结构的一部分,并且从结构中提取数据的语法多样化方式也在增长.

为了说明,假设用户不使用iris $ Species,而是在放入iris列表后,无论出于何种原因:

> my.function(my.list["iris"][,5])
> my.function(my.list[[2]]$iris[,"Species"]
Run Code Online (Sandbox Code Playgroud)

为了实现我想要的,我需要提出一定数量的正则表达式.现在我的问题是:在使用这些正则表达式之前,我是否忽略了一些现有函数或从函数调用中扣除层次结构的另一种方法?

MrF*_*ick 5

首先,让我先说一下,试着解析传递给你的函数的参数可能不是一个好主意.传递给函数的值很容易是更复杂函数的结果,即my.function(cbind(other.function(data=15, col=5), 1:15))肯定没有相同的"层级"解释.

其次,如果你试图解析语言对象,那么使用正则表达式这样做几乎总是一个糟糕的选择.R是一种功能语言,提供大量的反射/内省类型操作.让解析器进行解析,然后您可以走语法树来提取您喜欢的内容.

这里有人说你可以拉开参数的"级别"

datapath <- function(x) {
    xs <- substitute(x)
    if(!is.recursive(xs)) {
        if(class(xs) != "character")
            return(deparse(xs))
        else 
            return(xs)
    }
    xx <- as.list(xs)
    xn <- deparse(xx[[1]])
    if (xn %in% c("$","[","[[")) {
        unlist(sapply(xx[-1], function(x) 
            if(deparse(x) !="") do.call("datapath", list(x))))
    } else {
        stop(paste("unable to parse:", xs))
    }
}

datapath(my.list["iris"][,5])
# [1] "my.list" "iris"    "5"   
datapath(my.list[[2]]$iris[,"Species"])
# [1] "my.list" "2"       "iris"    "Species"
Run Code Online (Sandbox Code Playgroud)