在包中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中有一个常见的函数调用模式,如下所示:
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) 计划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时,这会导致内存泄漏吗?
我有一个很大的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) 我需要一个函数生成器,它接受另一个函数和该函数的任何参数并设置新的默认值.我以为@ 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) 此问题使用包含列表列(嵌套)的 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) 我正在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
对象。伟大的!但是,我现在想创建一个将基本 r 图与 2 个数字相结合的多重图。我在用%<a-%
pryr
ggplot
grid.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) 我有这个代码:
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 表达式解析为列表,并在最终将其转换为 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 表达式解析树。