Надежный тест, если выражение может быть приведено к символу, чтобы избежать ошибки as.character - PullRequest
1 голос
/ 10 апреля 2020

Я ищу надежный тест (= не выдает ошибку), можно ли преобразовать выражение в символ.

Как я могу это сделать?

Я хочу избежать этого вызов as.character выдает ошибку как например. в случае as.character(function() 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: Я хочу проверить, можно ли привести значение выражения к символу (не самому выражению)

1 Ответ

1 голос
/ 10 апреля 2020

Я уверен, что будут лучшие ответы на этот вопрос, и я с нетерпением жду их чтения. Желание оценить результаты предполагает, что они склонны к оценке, но если любой неизвестный ввод принят, никто не может быть уверен.

В зависимости от того, куда движется ваш конвейер, изучите варианты 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 не застрахован от других пользовательских ошибок на пути к оцененным результатам

as.character(typeof(function(x) 1, 'a'))
Error in typeof(function(x) 1, "a") : unused argument ("a")

Я нахожу это интересным вопросом, потому что я всегда предполагал, что есть способ рендерить строки любого объекта в R, хотя путь может быть запутанным.

С наилучшими пожеланиями вы будете знать весь ваш проект и то, где вы пытаетесь контролировать оценку.

...