小编egn*_*nha的帖子

使用roxygen2仅继承某些参数

在roxygen2中,可以使用标记@inheritParams继承另一个函数的完整参数集.但它是否也可以只继承它们的某个子集?(不包括继承的情况...,由...充分处理@inheritDotParams.)

r roxygen2

15
推荐指数
1
解决办法
851
查看次数

功能层次结构的组成

有没有一种规范的方式来表达一个函数,它是一个有根函数树的组合?

这是一个具体的例子,我的意思是"功能树的组成".取一个根节点的树,其节点由函数标记,如下所示:

在此输入图像描述

节点处的每个函数都是其子节点处的函数的组合.与树相关联的函数本身就是组合

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参数的函数TL返回L根据树结构化的函数的组合T

以这种方式,组合物的"布线" - 树T- 与其内部"组件" - 列表分开L."规范"解决方案尤其应该包括自然适应该问题的表示TL自然适应.

我怀疑这个问题在函数式编程语言中有一个简单的解决方案,但理想情况下我希望有一个像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

9
推荐指数
1
解决办法
5364
查看次数

基于谓词函数(dplyr :: mutate_if)变换数据框的列

我想使用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)

r dplyr purrr

6
推荐指数
2
解决办法
3369
查看次数

使用 roxygen2 导出函数列表

问题\xe2\x80\x94 我想导出函数列表作为 R 包的一部分,最好使用 roxygen2。

\n\n

更准确地说,我想导出列表中的函数,而不是列表本身。例如,考虑作为闭包生成的函数列表,如下所示:

\n\n
addval <- 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\n

将函数绑定到包环境可以很容易地完成;一种方法是

\n\n
for (nm in names(fns)) assign(nm, fns[[nm]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是是否可以使用 roxygen2 标签导出函数add_1add_2等?

\n\n

更重要的是:我希望 roxygen2 继续NAMESPACE为我管理文件,并且不希望export()直接编写调用。我能看到这样做的唯一方法是编写代码来生成样板文件,例如

\n\n
#\' @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\n

roxygen2 是否已经拥有相当于此类样板生成的设施,或者我必须自己提供此设施? …

r roxygen2 r-package

5
推荐指数
1
解决办法
1180
查看次数

将函数列表应用于参数列表

通过将函数列表应用于参数列表来创建列表的 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列表fncsargs(将单个函数应用于参数列表)。

这很容易做到:

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 mapply

1
推荐指数
1
解决办法
194
查看次数

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

productitertools模块中的笛卡尔积函数在哪里.然而,在Python,这样的使用map被认为是更令人费解的-即,小于表达-比等效使用列表解析的,如上所述.

string r

0
推荐指数
1
解决办法
582
查看次数