标签: pryr

什么是父母承诺?

在包中pryr,有一个叫做的函数parent_promise.

我知道承诺是什么,但我不熟悉父承诺这个词.此外,我并不真正理解文档中的示例,也许是因为我不知道我在寻找什么.

library(pryr)
example(parent_promise)
# prnt_p> f <- function(x) g(x)
# prnt_p> g <- function(y) h(y)
# prnt_p> h <- function(z) parent_promise(z)
# prnt_p> h(x + 1)
# x + 1
# prnt_p> g(x + 1)
# x + 1
# prnt_p> f(x + 1)
# x + 1
Run Code Online (Sandbox Code Playgroud)

为了帮助我更好地理解上面的例子,有人可以解释父承诺是什么,以及它是否/如何与常规承诺不同?

r promise pryr

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

基于变量名将位置参数转换为R函数中的命名参数

在R中有一个常见的函数调用模式,如下所示:

child = function(a, b, c) {
  a * b - c
}

parent = function(a, b, c) {
  result = child(a=a, b=b, c=c)
}
Run Code Online (Sandbox Code Playgroud)

这种重复的名称是有用的,因为如果要更改子项的参数的顺序,或者如果要将其他变量添加到列表中,它可以防止潜在的潜在错误:

childReordered = function(c, b, a) {  # same args in different order
  a * b - c
}

parent = function(a, b, c) {
  result = childReordered(a, b, c)  # probably an error
}
Run Code Online (Sandbox Code Playgroud)

但是当参数的名称变长时,这会变得很麻烦:

child = function(longVariableNameA, longVariableNameB, longVariableNameC) {
 longVariableNameA * longVariableNameB - longVariableNameC
}

parent = function(longVariableNameA, longVariableNameB, longVariableNameC) {
  child(longVariableNameA=longVariableNameA, …
Run Code Online (Sandbox Code Playgroud)

r pryr

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

为什么循环变量的地址在使用时会发生变化?

计划1:

 library(pryr)

 for (x in 1:3) {
     print(c(address(x), refs(x)))
 }
Run Code Online (Sandbox Code Playgroud)

输出例如:

[1] "0x7a6a6c8" "1"        
[1] "0x7a6a6c8" "1"        
[1] "0x7a6a6c8" "1"
Run Code Online (Sandbox Code Playgroud)

计划2:

library(pryr)

for (x in 1:3) {
  print(c(address(x), refs(x)))
  print(x)
}
Run Code Online (Sandbox Code Playgroud)

输出例如:

[1] "0x7ae0298" "1"        
[1] 1
[1] "0x7ae88c8" "1"        
[1] 2
[1] "0x7af2668" "1"        
[1] 3
Run Code Online (Sandbox Code Playgroud)

显然,x的价值在计划2中正在发生变化,但为什么地址也会发生变化?当循环运行大约500,000,000次而循环期间没有调用gc时,这会导致内存泄漏吗?

memory for-loop r pryr

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

在R中逐行绑定data.frames而不创建副本

我有一个很大的data.frames列表,需要按列成对绑定,然后在被送入预测模型之前按行绑定.由于没有值会被修改,我希望最终的data.frame指向我列表中的原始data.frames.

例如:

library(pryr)

#individual dataframes
df1 <- data.frame(a=1:1e6+0, b=1:1e6+1)
df2 <- data.frame(a=1:1e6+2, b=1:1e6+3)
df3 <- data.frame(a=1:1e6+4, b=1:1e6+5)

#each occupy 16MB
object_size(df1)  # 16 MB
object_size(df2)  # 16 MB
object_size(df3)  # 16 MB
object_size(df1, df2, df3)  # 48 MB

#will be in a named list
dfs <- list(df1=df1, df2=df2, df3=df3)

#putting into list doesn't create a copy
object_size(df1, df2, df3, dfs)  #48MB
Run Code Online (Sandbox Code Playgroud)

最终的data.frame将具有此方向(每列唯一的data.frames由列绑定,然后由行绑定):

df1, df2
df1, df3
df2, df3
Run Code Online (Sandbox Code Playgroud)

我目前正在实施这样的:

#generate unique df combinations
df_names <- names(dfs)
pairs <- combn(df_names, 2, …
Run Code Online (Sandbox Code Playgroud)

memory clone r dataframe pryr

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

功能生成; 更改其他功能的默认值(部分)

我需要一个函数生成器,它接受另一个函数和该函数的任何参数并设置新的默认值.我以为@ hadley pryr::partial是那个神奇的功能.它完全符合我的要求,除非您无法更改新的默认值.所以在这里我可以改变sep我的新paste功能但不是新的默认值collapse = "_BAR_".如何以partial这种方式执行(即默认为collapse = "_BAR_"启用但collapse = NULL如果需要可以设置)?如果这是不可能的,partial有没有办法重写代码partial来执行此操作:https://github.com/hadley/pryr/blob/master/R/partial.r

library(pryr)
.paste <- pryr::partial(paste, collapse = "_FOO_")

.paste(1:5)
.paste(1:5, LETTERS[1:5], sep="_BAR_")
.paste(1:5, collapse=NULL)

> .paste(1:5)
[1] "1_FOO_2_FOO_3_FOO_4_FOO_5"

> .paste(1:5, LETTERS[1:5], sep="_BAR_")
[1] "1_BAR_A_FOO_2_BAR_B_FOO_3_BAR_C_FOO_4_BAR_D_FOO_5_BAR_E"

> .paste(1:5, collapse=NULL)
Error in paste(collapse = "_FOO_", ...) : 
  formal argument "collapse" matched by multiple actual arguments
Run Code Online (Sandbox Code Playgroud)

r partial pryr

5
推荐指数
2
解决办法
400
查看次数

嵌套与未嵌套(整洁)data.frame 的大小?

此问题使用包含列表列(嵌套)的 data.frame。这让我想知道为什么/是否以这种方式工作有优势。我假设你想最小化每个表使用的内存量......但是当我检查时我很惊讶:

比较嵌套格式与整洁格式的表格大小:

1. 生成 2-col 和 5-col data.frame 的嵌套/整洁版本:

    library(pryr)
    library(dplyr)
    library(tidyr)
    library(ggvis)
    n <- 1:1E6
    df <- data_frame(id = n, vars = lapply(n, function(x)  x <- sample(letters,sample(1:26,1))))
    dfu <- df %>% unnest(vars)
    df_morecols <- data_frame(id = n, other1 = n, other2 = n, other3 = n,
                     vars = lapply(n, function(x)  x <- sample(letters,sample(1:26,1))))
    dfu_morecols <- df_morecols %>% unnest(vars)
Run Code Online (Sandbox Code Playgroud)

他们看着像是:

    head(df)
    #> Source: local data frame [6 x 2]

    #>   id      vars
    #> 1  1 <chr[16]>
    #> 2 …
Run Code Online (Sandbox Code Playgroud)

memory performance r pryr

5
推荐指数
0
解决办法
203
查看次数

R地址函数

我正在Raddress()中使用pryr包中的函数,并且想知道是否可以预期以下结果...

x <- 1:10
add <- function(obj){address(obj)}
address(x)
# [1] "0x112d007b0"
add(x)
# [1] "0x11505c580"
Run Code Online (Sandbox Code Playgroud)

即 0x112d007b0 != 0x11505c580

我希望它们的值相同……有没有办法调整add上面的函数以确保它得到相同的值?即获取父环境中的地址?

r pryr

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

将基本 r 图保存为可以在多重图中绘制的对象

这个问题是从一篇相关文章构建的,该文章展示了如何使用包中的函数轻松地将绘图存储为r对象。伟大的!但是,我现在想创建一个将基本 r 图与 2 个数字相结合的多重图。我在用%<a-%pryrggplotgrid.arrange下面。

使用基本 rcars数据我可以制作两个ggplot数字。

library(ggplot2)
library(pryr)
library(gridExtra)

Fig1 <- qplot(speed, data=cars, geom="histogram")
Fig2 <- qplot(dist, speed, data=cars, geom="point")
Run Code Online (Sandbox Code Playgroud)

然后,我使用 制作一个图形,并使用包中的函数plot将该图形保存为对象。光滑。%<a-%pryr

Fig3 %<a-% plot(cars$speed, cars$dist)
Fig3
Run Code Online (Sandbox Code Playgroud)

最后,我想将这 3 个数字组合成一个图,如下所示。

Figs <- grid.arrange(Fig1, Fig2, Fig3,
                     layout_matrix = rbind(c(1,1,1,2,2), c(1,1,1,2,2), c(3,3,3,3,3)))
Run Code Online (Sandbox Code Playgroud)

该代码产生以下错误:

Error in gList(list(grobs = list(list(x = 0.5, y = 0.5, width = 1, height = 1,  : 
  only 'grobs' allowed in …
Run Code Online (Sandbox Code Playgroud)

plot r ggplot2 pryr

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

获取R函数返回的变量名称

我有这个代码:

library(magrittr)
a <- function(cars) return(cars)
b <- function(x) return(list(varname = deparse(substitute(x)), content = x))
Run Code Online (Sandbox Code Playgroud)

b(cars)返回包含字符串cars和data.frame内容的列表cars.

还有什么方法a(cars) %>% b()可以返回字符串cars(函数返回的变量的名称a())和data.frame的内容?

相反,它返回.data.frame的内容.

也就是说,我希望第二个函数返回第一个函数返回的变量的名称以及变量的内容.

我真正想要做的b()就是这样write.csv(x, paste0(deparse(substitute(x)), ".csv")).

有什么建议?

r magrittr pryr

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

如何解析和修改 R 表达式(可能使用非标准评估)?

我想将 R 表达式解析为列表,并在最终将其转换为 json 对象之前选择性地修改它的各个方面。举个例子,我正在尝试实现以下目标:

{"op": "=",
      "content": {
          "lhs": "gender",
          "rhs": ["male"]
      }
}
Run Code Online (Sandbox Code Playgroud)

我将从 R 表达式开始,例如:

gender == "male"
Run Code Online (Sandbox Code Playgroud)

我可以用来pryr::ast获取树的文本版本,但我想将其作为列表获取,例如:

op: "=="
  [[1]]: "gender"
  [[2]]: "male"
Run Code Online (Sandbox Code Playgroud)

列表的“格式”细节并不那么重要,只要清楚即可。我的目标只是获得一个可计算且可修改的 R 表达式解析树。

r lazy-evaluation pryr

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