我正在尝试创建一个修改data.table的函数,并想使用一些非标准的评估,但是我意识到我并不真正知道如何在data.tables中使用它。我的功能基本上是这样的:
do_stuff <- function(dt, col) {
copy(dt)[, new_col := some_fun(col)][]
}
Run Code Online (Sandbox Code Playgroud)
我想这样称呼它:
do_stuff(data, column)
Run Code Online (Sandbox Code Playgroud)
其中“ column”是“ data”内部存在的列的名称。如果我运行该函数,则会出现错误:
#> Error in some_fun(col) : object 'column' not found
Run Code Online (Sandbox Code Playgroud)
这对我说data.table显然是将正确的名称传递给该函数(“列”),但由于某种原因找不到它。这是一个最小的可复制示例
library(data.table)
data <- data.table(x = 1:10, y = rnorm(10))
plus <- function(x, y) {
x + y
}
add_one <- function(data, col) {
copy(data)[, z := plus(col, 1)][]
}
add_one(data, y)
#> Error in plus(col, 1): object 'y' not found
Run Code Online (Sandbox Code Playgroud)
deparse(substitute(col))不幸的是,使用似乎无效:(
add_one <- function(data, col) {
copy(data)[, z := plus(deparse(substitute(col)), 1)][]
} …Run Code Online (Sandbox Code Playgroud) 我正在使用ggplot2绘制一些半球场,当我尝试将它们投影到立体投影时,渲染需要很长时间.这是一个最小的例子:
lat <- seq(-87.159, -2, by = 3.7)
lon <- seq(0, 360, by = 3.75)
month <- 1:12
gdata <- expand.grid(lat = lat, lon = lon, month = month)
gdata$z <- rnorm(nrow(gdata))
g <- ggplot(gdata, aes(lon, lat)) +
geom_tile(aes(fill = z)) +
facet_wrap(~month, ncol = 4)
benchplot(g)
Run Code Online (Sandbox Code Playgroud)
我明白了:
step user.self sys.self elapsed
1 construct 0.000 0.000 0.000
2 build 0.156 0.004 0.162
3 render 0.976 0.016 0.990
4 draw 0.464 0.000 0.464
5 TOTAL 1.596 0.020 1.616
Run Code Online (Sandbox Code Playgroud)
如果我添加一个投影 coord_map()
benchplot(g …Run Code Online (Sandbox Code Playgroud) 我正在编写一个扩展的包ggplot2。这些扩展之一是geom_arrow()需要美观mag并按angle大小和方向绘制矢量场。我还创建了一个scale_mag()来操纵箭头的长度,并希望创建一个新的指南。现在,当添加在一起时,几何和比例都可以按预期工作。
ggplot(geo, aes(lon, lat)) +
geom_arrow(aes(mag = mag, angle = angle)) +
scale_mag()
Run Code Online (Sandbox Code Playgroud)

但如果我不添加scale_mag(),它根本不起作用。我想要的是让这个比例像 一样工作,当审美存在scale_color()时默认添加它。color
这是现在的代码:
geom_arrow <- function(mapping = NULL, data = NULL,
stat = "arrow",
position = "identity", ...,
start = 0,
direction = 1,
# scale = 1,
min.mag = 0,
skip = 0,
skip.x = skip,
skip.y = skip,
arrow.angle = 15,
arrow.length = 0.5,
arrow.ends = "last",
arrow.type = "closed", …Run Code Online (Sandbox Code Playgroud) 我正在使用一些网格数据,而且我在使用离散分支秤时遇到了问题.具体来说,如何设置中点使其不在范围的中心.这是一个可重现的例子来得到我的意思:
library(ggplot2)
grid <- expand.grid(lon = seq(0, 360, by = 2), lat = seq(-90, 0, by = 2))
grid$z <- with(grid, cos(lat*pi/180) - .7)
ggplot(grid, aes(lon, lat)) +
geom_raster(aes(fill = cut_width(z, .1))) +
scale_fill_brewer(palette = "RdBu")
Run Code Online (Sandbox Code Playgroud)

这里,标度的中心不是正值和负值之间的分界线.我知道我可以使用连续刻度,但我发现颜色较少有助于我想要显示的内容.
有没有办法在不连续的尺度上改变中点?其他可以达到相同结果的替代方案也是受欢迎的.
我尝试使用facet_grid() 显示三个时间序列,为了节省空间,我减少了它们之间的面板间距。问题是它们的垂直轴重叠,所以我想仅在中间的图上将其移动到右侧。
由于这在 ggplot2 中似乎不可能,所以我想做的是渲染每个轴,然后通过编辑 gtable 将其删除,但到目前为止我还没有成功。
这是一个最小的例子:
library(ggplot2)
set.seed(123)
df <- data.frame(expand.grid(x = 1:150, type = letters[1:3]))
df$y <- df$x*0.016 + rnorm(150, sd = .5)
ggplot(df, aes(x, y)) + geom_line() +
facet_grid(type~.) +
theme(panel.spacing.y = unit(-3, "lines"), strip.text = element_blank()) +
scale_y_continuous(sec.axis = dup_axis(name = ""), name = "y")
Run Code Online (Sandbox Code Playgroud)
产生这个:

我想删除每个轴文本以达到此目的:

谢谢!