自动将多项式转换为R中ggplot图例的表达式

自动将多项式转换为R中ggplot图例的表达式,r,ggplot2,R,Ggplot2,我正在尝试将多项式变量字符串转换为R中的表达式,我已经看到了。然而,我正在努力概念化一种方法,它允许我提供一个变量列表,并开发一个字符串,该字符串对于ggplot图例来说是正确的。例如,我有以下字符串: variable.names <- c("x", "y", "yy", "xxx", "xxy", "yyy", "x

我正在尝试将多项式变量字符串转换为R中的表达式,我已经看到了。然而,我正在努力概念化一种方法,它允许我提供一个变量列表,并开发一个字符串,该字符串对于
ggplot
图例来说是正确的。例如,我有以下字符串:

variable.names <- c("x", "y", "yy", "xxx", "xxy", "yyy", 
                    "xxxxx", "xxxxy", "xxxyy", "xxyyy", "yyyyy")

variable.names
variable.names这里有一个整洁的解决方案,更新于2020-11-24T13:35:33,用于任何数量的变量,不包括
^
和输出表达式:

purrr::map(strsplit(variable.names, ""), ~{
    
    .str <- .x
    .vars <- purrr::map(unique(.str), ~{
        .instances <- sum(.str %in% .x)
        if (.instances == 0) .v <- NULL else if (.instances == 1) .v <- .x else if  (.instances > 1) .v <- paste0(.x,"^",.instances)
    })
    
    parse(text = paste0(.vars, collapse = "*"))  
    
})
purrr::map(strsplit(variable.names,”)~{

.str变量名是如何创建的?您可以使用该过程来创建表达式吗?变量名是使用类似于
strsplit
的方法创建的,它们是在多项式的初始展开过程中创建并重新排序的。下面提供的方法似乎可以按照我的要求工作。“多项式展开”我会首先从表达式中创建表达式,而不是变量名,反之亦然。我不喜欢解析的需要。扩展是基于
R
中的
polym
函数使用的。它根据结果列提供的数字生成变量名。这是保持c列的顺序是基于多项式次数而不是字母顺序。@Roland在tidy中有可能得到相同的结果吗?tidy解决方案面临的唯一问题是变量在图例中看起来不正确。例如,我不希望图例中有
^
符号。所以您希望x2y2代表x^2y^2?@AW27我更新了您只需要更新输出行以给出一个表达式:
rlang::parse_expr(do.call(paste0.vars))
,正如我在上面所做的那样。@AW27好的,您的第一条评论是>“我不希望图例中出现
^
,因此我认为您不希望出现这种情况。它已更新,可为您提供
表达式
调用
variable.names <- c("x", "y", "yy", "xxx", "xxy", "yyy", 
                    "xxxxx", "xxxxy", "xxxyy", "xxyyy", "yyyyy")

foo <- function(x) {
  runlength <- rle(x)
  string <- gsub("^1", "", 
                 paste0(paste(runlength$values, 
                              runlength$lengths, sep = "^"), 
                        collapse = "*"), 
                 fixed = TRUE)
  parse(text = string)
}

res <- lapply(strsplit(variable.names, ""), foo)



plot.new()

plot.window(c(0, 2), c(0, 11))
text(1, 10:0, do.call(c, res))
purrr::map(strsplit(variable.names, ""), ~{
    
    .str <- .x
    .vars <- purrr::map(unique(.str), ~{
        .instances <- sum(.str %in% .x)
        if (.instances == 0) .v <- NULL else if (.instances == 1) .v <- .x else if  (.instances > 1) .v <- paste0(.x,"^",.instances)
    })
    
    parse(text = paste0(.vars, collapse = "*"))  
    
})