我想回答一个关于plotmath的问题,但是我没有得到我想要的substitute输出。我想要的输出:paste("Hi", paste(italic(yes),"why not?"))
我得到了什么:paste("Hi", "paste(italic(yes),\"why not?\")")
text<-'paste(italic(yes),"why not?")'
text
[1] "paste(italic(yes),\"why not?\")"
noqoute_text<-noquote(text)
noqoute_text
[1] paste(italic(yes),"why not?")
sub<-substitute(paste("Hi",noqoute_text),
env=list(noqoute_text=noqoute_text))
sub
paste("Hi", "paste(italic(yes),\"why not?\")")发布于 2018-12-04 12:13:49
您使用错误的函数,请使用parse而不是noquote:
text<-'paste(italic(yes),"why not?")'
noquote_text <- parse(text=text)[[1]]
sub<- substitute(paste("Hi",noquote_text),env=list(noquote_text= noquote_text))
# paste("Hi", paste(italic(yes), "why not?"))noquote只是将class应用于character类型的对象,并使用特定的print方法不显示引号。
str(noquote("a"))
Class 'noquote' chr "a"
unclass(noquote("a"))
[1] "a"请你详细说明一下你的答案好吗?
在R中,你应该注意物体中的东西和打印出来的东西之间的区别。
noquote所做的是:
"noquote"添加到对象的类属性守则是:
function (obj)
{
if (!inherits(obj, "noquote"))
class(obj) <- c(attr(obj, "class"), "noquote")
obj
}然后,当您打印它时,方法print.noquote:
"noquote"。quote = FALSE调用quote = FALSE您也可以在字符串上调用print.noquote:
print.noquote("a")
[1] a它的确以与quote(a)或substitute(a)相似的方式印刷,但它是一只完全不同的动物。
在您尝试的代码中,您已经替换了一个字符串而不是一个调用。
发布于 2018-12-10 12:10:56
为了解决这个问题,我认为Moody_Mudskipperss的答案很好,但正如你要求的那样.
你需要小心不同的方式,相似的东西实际上存储在R,这意味着他们的行为不同。
特别是plotmath处理标签的方式,因为它们试图模仿通常处理character-strings的方式,但随后应用它自己的规则。你混合的三件事我想:
character()是最熟悉的:只是一个字符串。当转义引号等时,打印可能会令人困惑。函数noquote基本上告诉R标记它的参数,这样引号就不会转义。{中使用的那样不同的函数可以在这些类之间进行转换,但有时是函数(如paste!)还意外地转换:
noquote已经指出的那样,Moody_Mudskipper并没有做那么多有用的事情:它只改变了打印。但对象基本上仍然是一个字符。substitute不仅替代变量,而且还将其第一个参数转换为(最常见的)调用。在这里,print会咬你一口,因为在打印呼叫时,没有为其成员的特殊类提供任何规定。试试看:问题中的sub[[3]]给出
1膏(斜体(是),“为什么不?”)
没有任何反斜杠!只有在打印完整的调用时,不报价部分才会丢失。parse用于将字符转换为表达式。还没有进行任何计算,但是引入了一些结构,以便您可以操作表达式。paste经常表现得很烦人(尽管有记录),因为它只能将字符串粘贴在一起。因此,如果您给它除了一个字符之外的任何内容,它会直接调用as.character。所以如果你给它打电话,你就会再收到一条短信。所以在你的问题中,即使你使用解析,一旦你开始粘贴东西在一起,你会再次得到引号。最后,您的问题更加困难,因为它使用的是plotmath的内部逻辑。
这意味着,一旦尝试计算文本,很可能会出现“未能找到函数斜体”的错误(如果在其他地方定义了一个函数italic,则会出现更令人困惑的错误)。当提供它时,它是有效的,因为调用只由plotMath来评估,这将给它一个很好的环境,在这里斜体的工作就像预期的那样。
这意味着您需要将其视为一个表达式或调用。只要不能完成评估(只要是您来处理表达式,而不是计谋),所有这些都需要保留一个表达式或调用。给替代者一个调用是有效的,但是您也可以更密切地模拟R中发生的事情。
call('paste', 'Hi', parse(text=text)[[1]])https://stackoverflow.com/questions/52026127
复制相似问题