稳健测试表达式是否可以强制为字符以避免as.character错误

稳健测试表达式是否可以强制为字符以避免as.character错误,r,character,coercion,R,Character,Coercion,我正在寻找一个可靠的测试(=不抛出错误)是否可以将表达式转换为字符 我怎么能这样做 我希望避免调用as.character会引发错误,例如在as.character(函数()1)的情况下,会出现以下错误: Error in as.character(function() 1) : cannot coerce type 'closure' to vector of type 'character' 示例表达式: # do not throw an error in as.character

我正在寻找一个可靠的测试(=不抛出错误)是否可以将表达式转换为字符

我怎么能这样做

我希望避免调用
as.character
会引发错误,例如在
as.character(函数()1)
的情况下,会出现以下错误:

Error in as.character(function() 1) : 
  cannot coerce type 'closure' to vector of type 'character'
示例表达式:

# do not throw an error in as.character
1
1:10
"test"
NA
1 + 2
# do throw an error in as.character
function() 1
new.env()
PS:当然我可以使用
tryCatch
,但是有更简单的方法吗


编辑1:我想测试表达式的结果值是否可以强制为字符(而不是表达式本身)

我相信这个问题会有更好的答案,我期待着阅读它们。想要得到经过评估的结果,假设它们易于评估,但如果接受任何未知输入,则无法确定

根据管道的下一步走向,探索
quote
expression
的变体

as.character(quote(function() 1))
[1] "function"                      "NULL"                         
[3] "1"                             "c(1, 20, 1, 31, 20, 31, 1, 1)"

as.character(expression(1 + 2))
[1] "1 + 2"

as.character(eval(expression(1+2)) # works in this case
[1] "3"

as.character(eval(expression(1+2, 'A') # what would this be?
[1] "A" # so nonsense
另一种方法可能是找出你在野外被传递的是什么样的东西,然后决定如何处理它:

as.character(typeof(function() 1))
[1] "closure" # not safe or just pass along "closure" and move on

as.character(typeof(new.env())
[1] "environment" # not safe

as.character(typeof(expression(1+2))
[1] "expression" # safe (maybe) for further manipulation, replace typeof with eval
但是
typeof
并不能避免在评估过程中出现其他用户错误 结果

我发现这是一个有趣的问题,因为我一直认为有一种方法可以渲染R中的任何对象,尽管路径可能是复杂的


您将最清楚您的整个项目以及您试图控制评估的位置。

as.character(quote(function()1)
产生
[1]“function”“NULL”[3]“1”c(1,20,1,31,20,31,1,1)
虽然我不确定这是否是一个可靠的测试,但并没有抛出错误。有趣的想法!我刚刚用
作为.character(引号(1+2))
尝试了它,然后表达式不会被计算,而是保持原样:
[1]“+”1“2”
(而不是
3
)。因为我不知道用户作为参数引用所传递的内容,所以引用可能会导致错误的强制结果(但也许有办法处理)。该操作是同步的还是异步的?是否需要调用/log/识别上面提到的将出错的情况?@Chris我不确定你的意思。我的简单用例是(在伪代码中):
if(can.be.converted.to.character(x))log.debug(粘贴(“x=”,as.character(x))
不确定这是否会更接近
as.character(eval(表达式(1+2))[1]“3”
但对于new.env()失败,与serialize相同。使用
Promissions
pkg过滤好坏是否是欺骗?我不知道编码是否必要,也不知道如何改进tryCatch。有趣的dilema。谢谢你的回答!我的问题可能有些不明确:我想测试表达式结果(而不是解析的表达式)如果它可以被强制为字符。我已经通过编辑我的问题澄清了这一点
as.character(typeof(function(x) 1, 'a'))
Error in typeof(function(x) 1, "a") : unused argument ("a")