首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用双引号或其他命令以编程方式构建绘图表达式和字符串

使用双引号或其他命令以编程方式构建绘图表达式和字符串
EN

Stack Overflow用户
提问于 2017-04-21 10:20:37
回答 1查看 223关注 0票数 1

我想以编程的方式构建一些plotmath表达式和一些字符串。表达式和字符串(换句话说,所需的输出)是

代码语言:javascript
复制
k[xy[2]]
k[xy[5]]
k[xy[7]]
k[xy[9]]    
k[xy[11]]
k[xy[13]]
K[xx[2]]
K[xx[5]]
K[xx[7]]
K[xx[9]]    
K[xx[11]]
K[xx[13]]
C[xx[2]]
C[xx[5]]
C[xx[7]]
C[xx[9]]    
C[xx[11]]
C[xx[13]]
"k_xy_2"
"k_xy_5"
"k_xy_7"
"k_xy_9"
"k_xy_11"
"k_xy_13"
"Kxx_2"
"Kxx_5"
"Kxx_7"
"Kxx_9"
"Kxx_11"
"Kxx_13"
"Cxx_2"
"Cxx_5"
"Cxx_7"
"Cxx_9"
"Cxx_11"
"Cxx_13"

您可以看到,它们非常多,所以我宁愿通过编程方式构建它们,而不是硬编码它们(针对DRY指令重复许多行代码)。构建字符串很容易(但是如果你有一个更好/更快的想法,我会全神贯注地听):

代码语言:javascript
复制
for (i in c(2,5,7,9,11,13)) { 

    for (var in c("k_xy", "Kxx", "Cxx")) {
            print(paste0(var,i))
    }

}

但是,如何构建plotmath表达式?我想使用bquote,但它让我头疼:

代码语言:javascript
复制
for (i in c(2,5,7,9,11,13)) { 

    for (var in list(c("k_","xy"), c("K","xx"), c("C","xx"))) {
        print(paste0(var[1],var[2],i))
        print(bquote(.(var[1])[.(var[2])[.(i)]]))
    }

} 

输出:

代码语言:javascript
复制
[1] "k_xy2"
"k_"["xy"[2]]
[1] "Kxx2"
"K"["xx"[2]]
[1] "Cxx2"
"C"["xx"[2]]
[1] "k_xy5"
"k_"["xy"[5]]
[1] "Kxx5"
"K"["xx"[5]]
[1] "Cxx5"
"C"["xx"[5]]
[1] "k_xy7"
"k_"["xy"[7]]
[1] "Kxx7"
"K"["xx"[7]]
[1] "Cxx7"
"C"["xx"[7]]
[1] "k_xy9"
"k_"["xy"[9]]
[1] "Kxx9"
"K"["xx"[9]]
[1] "Cxx9"
"C"["xx"[9]]
[1] "k_xy11"
"k_"["xy"[11]]
[1] "Kxx11"
"K"["xx"[11]]
[1] "Cxx11"
"C"["xx"[11]]
[1] "k_xy13"
"k_"["xy"[13]]
[1] "Kxx13"
"K"["xx"[13]]
[1] "Cxx13"
"C"["xx"[13]]

显然不是我想要的。有什么更好的主意吗?PS不觉得被迫遵循我丑陋的代码,我只关心输出。

编辑I被建议只解析字符串,但我不知道它意味着什么。我需要plotmath为我的情节构建标签:字符串对此不好,但是它们很好地构建了我保存情节的文件的名称(这就是为什么我需要plotmath表达式字符串)。例子:这很好。

代码语言:javascript
复制
plot(0, xlab = expression(k[xy[13]]))

但这并不是:

代码语言:javascript
复制
plot(0, xlab = expression("k_xy_13"))

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-22 08:03:04

构建一个表达载体:

代码语言:javascript
复制
expr <- vector(length = 3, mode = "expression")
expr[[1]] <- quote(k[xy[.(i)]])
expr[[2]] <- quote(K[xx[.(i)]])
expr[[3]] <- quote(C[xx[.(i)]])

数字指数:

代码语言:javascript
复制
nums <- c(2,5,7,9,11,13)

循环来应用bquote。我们使用一些do.call魔术来替换表达式:

代码语言:javascript
复制
plotexpr <- mapply(function(e, i) do.call(bquote, list(e)), 
                   rep(expr, each = length(nums)), nums)

显示结果:

代码语言:javascript
复制
plot.new()
plot.window(c(0.4, 0.6), c(-0.5, 0.5))
for (i in seq_along(plotexpr)) 
  text(0.5, -0.5 + 0.05 * i, plotexpr[[i]])

创建字符串的高效向量化方法:

代码语言:javascript
复制
do.call(paste0, 
        expand.grid(c(2,5,7,9,11,13), c("k_xy_", "Kxx_", "Cxx_"))[, 2:1])
 #[1] "k_xy_2"  "k_xy_5"  "k_xy_7"  "k_xy_9"  "k_xy_11" "k_xy_13" "Kxx_2"   "Kxx_5"  
 #[9] "Kxx_7"   "Kxx_9"   "Kxx_11"  "Kxx_13"  "Cxx_2"   "Cxx_5"   "Cxx_7"   "Cxx_9"  
#[17] "Cxx_11"  "Cxx_13" 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43540154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档