gpt4 book ai didi

r - 将 `ggplot` 调用存储在 `data.frame`(或替代)中,然后对其进行评估

转载 作者:行者123 更新时间:2023-12-04 12:37:06 26 4
gpt4 key购买 nike

我想将 ggplot 调用存储在 data.frame(或替代方案)中,稍后对其进行评估。

一个例子:

define <- function(df, call) {
df[nrow(df) + 1, ] <- call
df
}

plot <- function(df, index) {
eval(parse(text = df$plots[index]))
}

df <- data.frame(plots = character(0), stringsAsFactors = FALSE)

df <- define(df, "ggplot() + geom_segment(aes(x = 1, y = 1, xend = 2, yend = 2))")
df <- define(df, "ggplot() + geom_segment(aes(x = 1, y = 2, xend = 2, yend = 1))")

plot(df, 1)
plot(df, 2)

这类作品和情节:

enter image description here enter image description here

但是有一些问题:

  1. 我想定义不带“”符号的调用。例如define(df, ggplot() + geom_..)
  2. 我宁愿将调用存储为 call 对象。

我怎样才能做到这一点?

最佳答案

对于这种情况,我会使用一个列表。 data.frame 在存储未评估的内容时有点棘手(因为在它们下面包含的信息不仅仅是调用)。列表更通用(在此上下文中更易于使用):

#saves the unevaluated call
define <- function(mylist, call) {
mylist[[length(mylist) + 1]] <- substitute(call)
mylist
}

#evaluates the call
ploteval <- function(mylist, index) {
eval(mylist[[index]])
}

mylist <- list()

mylist <- define(mylist, ggplot() + geom_segment(aes(x = 1, y = 1, xend = 2, yend = 2)))
mylist <- define(mylist, ggplot() + geom_segment(aes(x = 1, y = 2, xend = 2, yend = 1)))


ploteval(mylist, 1)
ploteval(mylist, 2)

这会起作用。

enter image description here

enter image description here

作为一个简短的解释,substitute 将存储未评估的调用,然后将使用 ploteval 对其进行评估。覆盖 plot 也不是一个好主意,所以我给它起了一个新名字 ploteval

关于r - 将 `ggplot` 调用存储在 `data.frame`(或替代)中,然后对其进行评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55457047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com