小编Eli*_*lli的帖子

将变量名称作为参数传递给data.table

我正在尝试创建一个修改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)

r data.table

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

与geom_tile()结合的coord_map()非常慢

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

r spatial ggplot2 r-raster

7
推荐指数
0
解决办法
347
查看次数

如何告诉 ggplot2 使用用户创建的比例来实现新的美感。

我正在编写一个扩展的包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)

r ggplot2

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

ggplot2中离散分歧尺度的中点

我正在使用一些网格数据,而且我在使用离散分支秤时遇到了问题.具体来说,如何设置中点使其不在范围的中心.这是一个可重现的例子来得到我的意思:

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)

这里,标度的中心不是正值和负值之间的分界线.我知道我可以使用连续刻度,但我发现颜色较少有助于我想要显示的内容.

有没有办法在不连续的尺度上改变中点?其他可以达到相同结果的替代方案也是受欢迎的.

plot r ggplot2

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

从一个面上删除轴文本

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

产生这个:

制作剧情

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

用 gimp 绘制的图

谢谢!

r ggplot2

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

标签 统计

r ×5

ggplot2 ×4

data.table ×1

plot ×1

r-raster ×1

spatial ×1