Вопрос по legend, tex, r, plot, special-characters – R: создание векторов латинского / греческого выражения для заголовков сюжетов, меток осей или легенд

8

Я хотел бы объединить векторы латинского и греческого текста для создания заголовков сюжетов, меток осей, записей легенды и т. Д. Ниже приведен тривиальный пример. Я не могу понять, как перевести греческие буквы в их родной форме. Я пробовал различные комбинации,expressionparse, а такжеapply кpaste команда, но я не смог векторизовать код, который легко генерирует смешанный латинский / греческий текст для случая одного выражения (например,expression("A ("*alpha*")") подходит в случае одного выражения).

data

Ваш Ответ

2   ответа
8

альтернатива, которая избегаетparse()и работает с примером, упомянутым в вашем первом комментарии к @mnel 'хороший ответ:

greek <- c("alpha", "beta", "gamma", "delta")
cnames <- paste(LETTERS[1:4], letters[1:4])

legend_expressions <- 
sapply(1:4, function(i) {
    as.expression(substitute(A (B), 
                  list(A = as.name(cnames[i]), B = as.name(greek[i]))))
})

matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)

Спасибо за добавленное разъяснение. В конечном итоге я решил выбрать ваш ответ, потому что он был наименее чувствительным к изменениям в формате ввода (например, добавление пробелов в строки). user001
@ user001 -substitute() нев общем-то возвращать объекты класса "выражение», (См.Значение" раздел?substituteи поиграть сclass(substitute()) чтобы понять, что я имею в виду:class(substitute(x)); class(substitute(x(y))); class(substitute({x; y})); class(substitute(expression(x))) и т.д.) пользуюсьas.expression() принуждатьбез разницы он возвращается к объекту выражения. выражения являются типом вектора, поэтомуsapply() просто объединяет несколько выражений длины-1 в один вектор-выражения длины-4. Увидеть?as.name узнать оas.name(), Надеюсь это поможет! Josh O'Brien
@ user001 - Как вы, вероятно, знаете,эта секция из "Определение языка R " является хорошей отправной точкой для того, чтобы опираться о R 'Языковые элементы и как ими манипулировать.substitute() может принять в качестве первого аргумента любое синтаксически правильное утверждение.A B не является "позволил" потому что это'с синтаксически действительным. (Можете ли вы вспомнить какой-либо оператор R, набранный в командной строке, который имеет такую форму? Я думал, что нет!). Josh O'Brien
Спасибо джош Ваше решение очень надежно для разных входов. Не могли бы вы объяснить, почему,A (B)A*B, а такжеA~B работать вsubstitute заявление, тогда какA B не? Не могли бы вы также прокомментировать для новых пользователей, почемуas. синтаксис обязателен? Я прочитал этоsubstitute возвращает неоцененное выражение, действуя на выходеsubstitute сas.expression имеет смысл. Как насчет ?as.name user001
3

apply создать вектор выражений.

Вместо этого используйте.parse(text = ...)

.expressions <- paste(colnames(data),greek,sep="")
legend_expressions <-parse(text = .expressions)

matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)

Если вы хотите включить~ в выражениях. Учитывая ваш текущий рабочий процесс, казалось бы, его проще всего заменитьsep = '' сsep = '~' в пределах звонкаpaste

.expressions <- paste(colnames(data),greek,sep="~")
legend_expressions <-parse(text = .expressions)

matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)

Это может быть даже понятнееsprintf сформировать строки символов, которые станут вашим вектором выражения.

Если вы хотите включить символьные строки, содержащие пробелы, вам нужно будет заключить эти строки в кавычки внутри строки. Например.

greek <- c("alpha", "beta", "gamma", "delta")
other_stuff <- c('hello world','again this','and again','hello')

.expressions <- mapply(sprintf, colnames(data), other_stuff, greek, 
                       MoreArgs = list(fmt = '"%s %s"~(%s)'))

.expressions  
##                           A                           B                           C                           D 
## "\"A hello world\"~(alpha)"   "\"B again this\"~(beta)"   "\"C and again\"~(gamma)"       "\"D hello\"~(delta)" 

 legend_expressions <-parse(text = .expressions)

matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)

Имена столбцов без пробелов не являются синтаксическими, и поэтому не стоит пытаться установить их в качестве имен столбцов для вашегоmatrix или жеdata.frame, Я думаю мойmapply(sprintf,...) Решение будет проще всего реализовать это с. mnel
В этом случае вам придется заменить в строке символов. что-то вродеgsub(x= .expressions,'~\\(\\)', '') mnel
Хитрость заставить их работать с выражениями - заключить их в кавычки внутри строки. Это сейчас реализовано mnel
Смотрите мои правки ...... mnel

Похожие вопросы