在roxygen2中,可以使用标记@inheritParams
继承另一个函数的完整参数集.但它是否也可以只继承它们的某个子集?(不包括继承的情况...
,由...充分处理@inheritDotParams
.)
有没有一种规范的方式来表达一个函数,它是一个有根函数树的组合?
这是一个具体的例子,我的意思是"功能树的组成".取一个根节点的树,其节点由函数标记,如下所示:
节点处的每个函数都是其子节点处的函数的组合.与树相关联的函数本身就是组合
F = a0(b0(c0(e0, e1, e2)), b1(d0(f0), d1(g0, g1)))
Run Code Online (Sandbox Code Playgroud)
更明确地,F
是由叶子上的函数计算的6个参数的函数:
F(x0, ... , x5) == a0(b0(c0(e0(x0), e1(x1), e2(x2))),
b1(d0(f0(x3)), d1(g0(x4), g1(x5))))
Run Code Online (Sandbox Code Playgroud)
一般问题
T
,以及一个L
与节点对应的函数列表T
,是否有一种规范的方法来编写F
参数的函数T
并L
返回L
根据树结构化的函数的组合T
?以这种方式,组合物的"布线" - 树T
- 与其内部"组件" - 列表分开L
."规范"解决方案尤其应该包括自然适应该问题的表示T
和L
自然适应.
我怀疑这个问题在函数式编程语言中有一个简单的解决方案,但理想情况下我希望有一个像Python这样的动态类型命令式语言的解决方案,类似于
def treecomp(tree, list_of_funcs):
...
return function
F = treecomp(T, L)
Run Code Online (Sandbox Code Playgroud)
与此同时,我想出了自己的解决方案(发布在下面).
虽然我对其经济和概念简单性感到满意,但我仍然对其他本质上不同的方法感兴趣,特别是那些利用Python中缺乏或支持不足的另一种语言的优势的方法.
使用适当的数据结构 - 基本上不会重现所需的输出! - …
python functional-programming hierarchy function-composition
我想使用dplyr的mutate_if()
函数将列表列转换为数据帧列,但是当我尝试这样做时会遇到令人费解的错误.我使用的是dplyr 0.5.0,purrr 0.2.2,R 3.3.0.
基本设置如下所示:我有一个数据框d
,其中一些列是列表:
d <- dplyr::data_frame(
A = list(
list(list(x = "a", y = 1), list(x = "b", y = 2)),
list(list(x = "c", y = 3), list(x = "d", y = 4))
),
B = LETTERS[1:2]
)
Run Code Online (Sandbox Code Playgroud)
我想d$A
使用以下函数将列的列(在本例中为)转换为数据帧列:
tblfy <- function(x) {
x %>%
purrr::transpose() %>%
purrr::simplify_all() %>%
dplyr::as_data_frame()
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我希望list-column d$A
被列表替换lapply(d$A, tblfy)
,即
[[1]]
# A tibble: 2 x 2
x y
<chr> <dbl>
1 a 1
2 …
Run Code Online (Sandbox Code Playgroud) 问题\xe2\x80\x94 我想导出函数列表作为 R 包的一部分,最好使用 roxygen2。
\n\n更准确地说,我想导出列表中的函数,而不是列表本身。例如,考虑作为闭包生成的函数列表,如下所示:
\n\naddval <- 1:100\nfns <- lapply(addval, function(y) {force(y); function(x) x + y})\nnames(fns) <- paste0("add_", addval)\n
Run Code Online (Sandbox Code Playgroud)\n\n那么问题是将函数(fns
例如,在 中使用相同的名称)绑定到包环境,然后将它们包含在包的导出函数中。
将函数绑定到包环境可以很容易地完成;一种方法是
\n\nfor (nm in names(fns)) assign(nm, fns[[nm]])\n
Run Code Online (Sandbox Code Playgroud)\n\n但是是否可以使用 roxygen2 标签导出函数add_1
、add_2
等?
更重要的是:我希望 roxygen2 继续NAMESPACE
为我管理文件,并且不希望export()
直接编写调用。我能看到这样做的唯一方法是编写代码来生成样板文件,例如
#\' @export add_1\nNULL\n\n#\' @export add_2\nNULL\n\n# ...\n
Run Code Online (Sandbox Code Playgroud)\n\n或更好
\n\n#\' @export\nadd_1 <- fns[["add_1"]]\n\n#\' @export\nadd_2 <- fns[["add_2"]]\n\n# ...\n
Run Code Online (Sandbox Code Playgroud)\n\n(并放弃上面的 for 循环)。
\n\nroxygen2 是否已经拥有相当于此类样板生成的设施,或者我必须自己提供此设施? …
通过将函数列表应用于参数列表来创建列表的 R 惯用方法是什么?
例如,给定一个函数列表和一个参数列表,数量相等(比如三个),
fncs <- list(f1, f2, f3)
args <- list(x1, x2, x3)
Run Code Online (Sandbox Code Playgroud)
我想获取函数值列表,
fnc_vals <- list(f1(x1), f2(x2), f3(x3))
Run Code Online (Sandbox Code Playgroud)
换句话说,我想将 base-R 函数的广义形式应用于mapply
列表fncs
和args
(将单个函数应用于参数列表)。
这很容易做到:
dapply <- function(args, fncs, ...) { # "diagonal" apply
lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...))
}
fnc_vals <- dapply(args, fncs)
Run Code Online (Sandbox Code Playgroud)
然而,在我看来,这很笨拙,因为如果在 R 中可能,没有扭曲,成对运行函数和参数以生成所需的函数值列表会更自然;在Python 中,这会是这样的:
fncs = [f1, f2, f3]
args = [x1, x2, x3]
fnc_vals = [f(x) for f, x in zip(fncs, args)]
Run Code Online (Sandbox Code Playgroud)
这个“zippy”结构也可以在 R 中实现吗?
在R中执行以下字符串连接的惯用方法是什么?
给出两个字符串向量,如下所示,
titles <- c("A", "B")
sub.titles <- c("x", "y", "z")
Run Code Online (Sandbox Code Playgroud)
我想生成矢量
full.titles <- c("A_x", "A_y", "A_z", "B_x", "B_y", "B_z")
Run Code Online (Sandbox Code Playgroud)
显然,这可以通过两个for循环来完成.但是,我想知道R中的"惯用"(即优雅和自然)解决方案是什么.
在Python中,惯用解决方案可能如下所示:
titles = ['A', 'B']
subtitles = ['x', 'y', 'z']
full_titles = ['_'.join([title, subtitle])
for title in titles for subtitle in subtitles]
Run Code Online (Sandbox Code Playgroud)
R是否允许相似程度的表达?
备注
到目前为止提出的解决方案之间的共识是,在R中这样做的惯用方法基本上是
full.titles <- c(t(outer(titles, sub.titles, paste, sep = "_")))
Run Code Online (Sandbox Code Playgroud)
有趣的是,这在Python中有一个(几乎)字面翻译:
full_titles = map('_'.join, product(titles, subtitles))
Run Code Online (Sandbox Code Playgroud)
product
itertools模块中的笛卡尔积函数在哪里.然而,在Python,这样的使用map
被认为是更令人费解的-即,小于表达-比等效使用列表解析的,如上所述.