разряженный вектор дробей, сохраняя дроби - PullRequest
2 голосов
/ 09 октября 2019

Есть ли способ использовать deparse для возврата строки с исходными дробями? Поведение по умолчанию показано ниже:

> deparse(c(1/2, 2/3, 3))
[1] "c(0.5, 0.666666666666667, 3)"

Желаемый результат "c(1/2, 2/3, 3)"

Аналогично списку:

> deparse(list("name", 1/2, 2/3))
[1] "list(\"name\", 0.5, 0.666666666666667)"

Желаемый результат "list(\"name\", 1/2, 2/3)"

РЕДАКТИРОВАТЬ:

Некоторые более подробные сведения о вводе. Пользователь может предоставить «1/2 2/3 3», например. После некоторого разбора я использую MASS::fractions, чтобы преобразовать в вектор или дроби.

x <- c(1/2, 2/3, 3)
x <- MASS::fractions(x)
deparse(x, control = "keepNA")
Result: "c(0.5, 0.666666666666667, 3)"
Desired result "c(1/2, 2/3, 3)"

Я ищу способ сказать deparse использовать нотацию дроби или еще способ подготовитьвектор перед переходом в разборку, поэтому я получаю желаемый результат. Из ответов пока (спасибо всем!) Кажется, что это может быть трудно

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Вы можете использовать deparse(quote(c(1/2, 2/3, 3))).

quote сначала будет заключать в кавычки выражение, которое сообщит намерение, а затем deparse преобразует в символьные строки

Выходные данные :

> deparse(quote(c(1/2, 2/3, 3)))
[1] "c(1/2, 2/3, 3)"

Хакерский путь:

 x = alist(x = c(1/2, 2/3, 3))
 deparse(x$x)

? Alist:

alist обрабатывает свои аргументыкак будто они описали аргументы функции. Таким образом, значения не оцениваются, и тегированные аргументы без значения допускаются, тогда как list просто игнорирует их. alist чаще всего используется в сочетании с формальностями.

Output :

     > deparse(x$x)
[1] "c(1/2, 2/3, 3)"
2 голосов
/ 09 октября 2019

Вы можете использовать функцию fractions() из пакета MASS. Например,

library(MASS)
tmp <- c(1/2, 2/3, 3)
fractions(tmp)
# [1] 1/2 2/3   3

Если вы действительно хотите это в форме c(1/2, 2/3, 3), используйте paste:

paste0("c(", paste(fractions(tmp), collapse = ", "), ")")
# [1] "c(1/2, 2/3, 3)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...