首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么替换将字母引号改为R中的字符串?

为什么替换将字母引号改为R中的字符串?
EN

Stack Overflow用户
提问于 2018-08-26 12:13:32
回答 2查看 1.3K关注 0票数 13

我想回答一个关于plotmath的问题,但是我没有得到我想要的substitute输出。我想要的输出:paste("Hi", paste(italic(yes),"why not?"))

我得到了什么:paste("Hi", "paste(italic(yes),\"why not?\")")

代码语言:javascript
复制
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?\")")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-04 12:13:49

您使用错误的函数,请使用parse而不是noquote

代码语言:javascript
复制
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方法不显示引号。

代码语言:javascript
复制
str(noquote("a"))
Class 'noquote'  chr "a"
unclass(noquote("a"))
[1] "a"

请你详细说明一下你的答案好吗?

在R中,你应该注意物体中的东西和打印出来的东西之间的区别。

noquote所做的是:

  • "noquote"添加到对象的类属性
  • 就这样

守则是:

代码语言:javascript
复制
function (obj) 
{
    if (!inherits(obj, "noquote")) 
        class(obj) <- c(attr(obj, "class"), "noquote")
    obj
}

然后,当您打印它时,方法print.noquote

  • 如果存在,则从对象中移除类"noquote"
  • 用参数quote = FALSE调用quote = FALSE
  • 就这样

您也可以在字符串上调用print.noquote

代码语言:javascript
复制
print.noquote("a")
[1] a

它的确以与quote(a)substitute(a)相似的方式印刷,但它是一只完全不同的动物。

在您尝试的代码中,您已经替换了一个字符串而不是一个调用。

票数 13
EN

Stack Overflow用户

发布于 2018-12-10 12:10:56

为了解决这个问题,我认为Moody_Mudskipperss的答案很好,但正如你要求的那样.

你需要小心不同的方式,相似的东西实际上存储在R,这意味着他们的行为不同。

特别是plotmath处理标签的方式,因为它们试图模仿通常处理character-strings的方式,但随后应用它自己的规则。你混合的三件事我想:

  • character()是最熟悉的:只是一个字符串。当转义引号等时,打印可能会令人困惑。函数noquote基本上告诉R标记它的参数,这样引号就不会转义。
  • 调用是“未评估的函数调用”:它是关于R应该做什么的指令,但尚未执行。这个调用中的任何错误还没有出现,您可以检查它。 请注意,一个调用没有给出它自己的环境,这意味着一个调用可以给出不同的结果,例如,在一个函数中进行评估。
  • 表达式与调用类似,但应用范围更广,即不总是需要执行的函数。表达式可以是变量名,但也可以是简单的值,例如“为什么不可以?”此外,表达式可以由多个单元组成,就像您在{中使用的那样

不同的函数可以在这些类之间进行转换,但有时是函数(如paste!)还意外地转换:

  • 正如noquote已经指出的那样,Moody_Mudskipper并没有做那么多有用的事情:它只改变了打印。但对象基本上仍然是一个字符。
  • substitute不仅替代变量,而且还将其第一个参数转换为(最常见的)调用。在这里,print会咬你一口,因为在打印呼叫时,没有为其成员的特殊类提供任何规定。试试看:问题中的sub[[3]]给出 1膏(斜体(是),“为什么不?”) 没有任何反斜杠!只有在打印完整的调用时,不报价部分才会丢失。
  • parse用于将字符转换为表达式。还没有进行任何计算,但是引入了一些结构,以便您可以操作表达式。
  • paste经常表现得很烦人(尽管有记录),因为它只能将字符串粘贴在一起。因此,如果您给它除了一个字符之外的任何内容,它会直接调用as.character。所以如果你给它打电话,你就会再收到一条短信。所以在你的问题中,即使你使用解析,一旦你开始粘贴东西在一起,你会再次得到引号。

最后,您的问题更加困难,因为它使用的是plotmath的内部逻辑。

这意味着,一旦尝试计算文本,很可能会出现“未能找到函数斜体”的错误(如果在其他地方定义了一个函数italic,则会出现更令人困惑的错误)。当提供它时,它是有效的,因为调用只由plotMath来评估,这将给它一个很好的环境,在这里斜体的工作就像预期的那样。

这意味着您需要将其视为一个表达式或调用。只要不能完成评估(只要是您来处理表达式,而不是计谋),所有这些都需要保留一个表达式或调用。给替代者一个调用是有效的,但是您也可以更密切地模拟R中发生的事情。

代码语言:javascript
复制
call('paste', 'Hi', parse(text=text)[[1]])
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52026127

复制
相关文章

相似问题

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