小编Cot*_*ood的帖子

使用进度条的FOR循环包装器

我喜欢在运行慢for循环时使用进度条.这可以通过几个助手轻松完成,但我确实喜欢tkProgressBar来自tcltk包.

一个小例子:

pb <- tkProgressBar(title = "Working hard:", min = 0, max = length(urls), width = 300)
for (i in 1:300) {
    # DO SOMETHING
    Sys.sleep(0.5)
    setTkProgressBar(pb, i, label=paste( round(i/length(urls)*100, 0), "% ready!"))
}
close(pb)
Run Code Online (Sandbox Code Playgroud)

而且我想设置一个小函数存储在我的.Rprofile中,命名为forp(as:for循环带进度条),调用就像for但是使用自动添加的进度条 - 但遗憾的是不知道如何实现和抓取expr部分循环函数.我做了一些实验do.call但没有成功:(

虚构的工作示例(其作用类似于for循环,但TkProgressBar在每次迭代中创建并自动更新它):

forp (i in 1:10) {
    #do something
}
Run Code Online (Sandbox Code Playgroud)

更新:我认为问题的核心是如何编写一个函数,该函数不仅在函数后面的括号中有参数(如:)foo(bar),而且还可以expr在结束括号后指定,如:foo(bar) expr.


BOUNTY OFFER:会找到任何可以修改我建议的函数的 …

expression loops r function wrapper

19
推荐指数
3
解决办法
1631
查看次数

dplyr summarise_each()使用多个函数来处理相同组中的不同列子集

我想summarise_each()用来将多个函数应用于分组数据集.但是,我不想将每个函数应用于所有列,而是将每个函数应用于特定的子集.我意识到我可以通过指定每个列来实现这一点summarise(),但我有很多变量.

是否有替代方案1)使用summarise_each()然后删除不需要的列或2)保存group_by()结果,执行多个单独的summarise_each()操作并组合结果?

如果不清楚,请告诉我,我可以尝试用一些示例代码来说明.

r dplyr

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

查找(并返回)满足(逻辑)测试的列表的第一个元素

作为一个例子,我有一个包含各种长度(和一些NULL)的矢量列表,并希望找到第一个包含两个元素的列表元素.正如在这篇文章中,我知道使用列表,您可以通过使用sapply()和子集化第一个结果来使用类似的方法.由于上面链接的帖子中的解决方案在match()这种情况下不起作用,我很好奇是否有更优雅(并且计算效率更高)的方法来实现这一点.

一个可重复的例子


# some example data
x <- list(NULL, NULL, NA, rep("foo", 6), c("we want", "this one"),
           c(letters[1:10]), c("foo", "bar"), NULL)
x

# find the first element of length 2 using sapply and sub-setting to result #1
x[sapply(x, FUN=function(i) {length(i)==2})][[1]]
Run Code Online (Sandbox Code Playgroud)

或者,正如@Josh O'Brien对这篇文章的回答一样,

# get the index of the first element of length 2
seq_along(x)[sapply(x, FUN=function(i) {length(i)==2})]
Run Code Online (Sandbox Code Playgroud)

有什么想法或想法吗?

r list subset

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

标签 统计

r ×3

dplyr ×1

expression ×1

function ×1

list ×1

loops ×1

subset ×1

wrapper ×1