函数的维度

时间:2016-07-12 07:31:06

标签: r function dimensions

因为这会略微简化我的代码,所以我主要是出于好奇。假设你有一个功能

f <- function(x) {
  c(x[1] - x[2],
    x[2] - x[3],
    x[3] - x[1])
}

有没有办法找出所需输入的维度,例如

dim(f) = 3

1 个答案:

答案 0 :(得分:0)

这是一个非常值得怀疑的解决方案,涉及computing on the language

我已经编写了三个函数,可以根据一种&#34;模板来匹配,搜索和提取解析树。解析树片。他们在这里:

ptlike <- function(lhs,rhs,wcs='.any.',wcf=NULL) if (is.symbol(rhs) && as.character(rhs)%in%wcs) !is.function(wcf) || isTRUE(wcf(lhs,as.character(rhs))) else typeof(lhs) == typeof(rhs) && length(lhs) == length(rhs) && if (is.call(lhs)) all(sapply(seq_along(lhs),function(i) ptlike(lhs[[i]],rhs[[i]],wcs,wcf))) else lhs == rhs;
ptfind <- function(ptspace,ptpat,wcs='.any.',wcf=NULL,locf=NULL,loc=integer(),ptspaceorig=ptspace) c(list(),if (ptlike(ptspace,ptpat,wcs,wcf) && (!is.function(locf) || isTRUE(locf(ptspaceorig,loc)))) list(loc),if (is.call(ptspace)) do.call(c,lapply(seq_along(ptspace),function(i) ptfind(ptspace[[i]],ptpat,wcs,wcf,locf,c(loc,i),ptspaceorig))));
ptextract <- function(ptspace,ptpat,gets='.get.',wcs='.any.',wcf=NULL,locf=NULL,getf=NULL) { getlocs <- do.call(c,lapply(gets,function(get) ptfind(ptpat,as.symbol(get),character()))); if (length(getlocs)==0L) getlocs <- list(integer()); c(list(),do.call(c,lapply(ptfind(ptspace,ptpat,unique(c(gets,wcs)),wcf,locf),function(loc) do.call(c,lapply(getlocs,function(getloc) { cloc <- c(loc,getloc); ptget <- if (length(cloc)>0) ptspace[[cloc]] else ptspace; if (!is.function(getf) || isTRUE(getf(if (missing(ptget)) substitute() else ptget,loc,getloc,as.character(ptpat[[getloc]])))) list(if (missing(ptget)) substitute() else ptget); }))))); };

ptlike()将两个解析树片相互匹配,允许RHS上的通配符匹配任何内容。例如:

ptlike(1L,2L);
## [1] FALSE
ptlike(1L,1L);
## [1] TRUE
ptlike(quote(a),quote(b));
## [1] FALSE
ptlike(quote(a),quote(a));
## [1] TRUE
ptlike(quote(sum(a+1)),quote(sum(b+1)));
## [1] FALSE
ptlike(quote(sum(a+1)),quote(sum(.any.+1)));
## [1] TRUE
ptlike(quote(sum(a+1)),quote(.any.(a+1)));
## [1] TRUE
ptlike(quote(sum(a+1)),quote(.any.));
## [1] TRUE

ptfind()为给定解析树空间(LHS)中的解析树模式(RHS,如果您愿意)的每个匹配返回一个递归索引向量,并将其组合到一个列表中。例如:

sp <- quote({ a+b*c:d; e+f*g:h; });
ptfind(sp,quote(.any.:.any.));
## [[1]]
## [1] 2 3 3
##
## [[2]]
## [1] 3 3 3
##
sp[[c(2L,3L,3L)]];
## c:d
sp[[c(3L,3L,3L)]];
## g:h

ptextract()ptfind()类似,但返回解析树空间的匹配部分或其子集:

ptextract(sp,quote(c:d));
## [[1]]
## c:d
##
ptextract(sp,quote(.any.:.any.));
## [[1]]
## c:d
##
## [[2]]
## g:h
##
ptextract(sp,quote(.any.:.get.));
## [[1]]
## d
##
## [[2]]
## h
##

所以我们可以做的是从x参数的所有下标中提取(包含函数体的解析树)函数并获取最大文字下标值:

f <- function(x) c(x[1L]-x[2L],x[2L]-x[3L],x[3L]-x[1L]);
max(unlist(Filter(is.numeric,ptextract(body(f),quote(x[.get.])))));
## [1] 3

这里Filter(is.numeric,...)件并不是必需的,因为所有下标都是字面数字(在你的定义中是双倍的,我的整数,虽然这是无关紧要的)但是如果有的话-numeric-literal下标,那就是必要的。

注意事项:

  • 这很荒谬。
  • 它不会考虑可能超出解析树中最大文字下标值的变量下标。 (严格地说,在一般情况下,由于停止问题或其他原因,静态分析可能在运行时发生的所有可能的下标
  • 如果向量被分配给不同的变量名称,比如说y,然后那个变量用不同的下标索引,甚至是数字文字下标,这个算法就不会考虑到这一点。
  • 可能还有更多。