R: создание векторов латинского / греческого выражения для заголовков сюжетов, меток осей или легенд

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

data

Ответы на вопрос(2)

Решение Вопроса

альтернатива, которая избегает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)

 user00101 нояб. 2012 г., 22:39
Спасибо за добавленное разъяснение. В конечном итоге я решил выбрать ваш ответ, потому что он был наименее чувствительным к изменениям в формате ввода (например, добавление пробелов в строки).
 user00101 нояб. 2012 г., 03:32
Спасибо джош Ваше решение очень надежно для разных входов. Не могли бы вы объяснить, почему,A (B)A*B, а такжеA~B работать вsubstitute заявление, тогда какA B не? Не могли бы вы также прокомментировать для новых пользователей, почемуas. синтаксис обязателен? Я прочитал этоsubstitute возвращает неоцененное выражение, действуя на выходеsubstitute сas.expression имеет смысл. Как насчет ?as.name
 Josh O'Brien01 нояб. 2012 г., 16:03
@ user001 - Как вы, вероятно, знаете,эта секция из "Определение языка R " является хорошей отправной точкой для того, чтобы опираться о R 'Языковые элементы и как ими манипулировать.substitute() может принять в качестве первого аргумента любое синтаксически правильное утверждение.A B не является "позволил" потому что это'с синтаксически действительным. (Можете ли вы вспомнить какой-либо оператор R, набранный в командной строке, который имеет такую форму? Я думал, что нет!).
 Josh O'Brien01 нояб. 2012 г., 16:14
@ 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(), Надеюсь это поможет!

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)

 mnel01 нояб. 2012 г., 02:19
Смотрите мои правки ......
 mnel01 нояб. 2012 г., 02:31
Хитрость заставить их работать с выражениями - заключить их в кавычки внутри строки. Это сейчас реализовано
 user00101 нояб. 2012 г., 02:54
Ах, включая кавычки в строку перед отправкой на анализ - отличная идея. Я нашел еще одну складку: что если я хочу, чтобы на одной из этикеток не было греческой буквы? измененияgreek вc("", "beta", "gamma", "delta") приводит к сбою кода снова. Вы знаете, как решить эту проблему?
 mnel01 нояб. 2012 г., 02:58
В этом случае вам придется заменить в строке символов. что-то вродеgsub(x= .expressions,'~\\(\\)', '')
 user00101 нояб. 2012 г., 02:25
Спасибо @mnel. Я хочу иметь возможность включать пробелы вcolnames (например, "А " вместо "А"). Тем не менееparse утверждение не удается, когдаcolnames включает в себя пробел Если пространство заменено тильдой (например, "А ~ А» вместо "А "), затемparse заявление больше не терпит неудачу. С помощью~ какsep вpaste до сих пор не работает дляcolname с пробелом какА а ".
 mnel01 нояб. 2012 г., 02:28
Имена столбцов без пробелов не являются синтаксическими, и поэтому не стоит пытаться установить их в качестве имен столбцов для вашегоmatrix или жеdata.frame, Я думаю мойmapply(sprintf,...) Решение будет проще всего реализовать это с.
 user00101 нояб. 2012 г., 02:12
Спасибо за ваше очень полезное решение. Не могли бы вы сказать мне, как пробелы могут быть включены в метки без явного использования~ персонажи? Например, переопределениеcolnames(data) вc("A~a","B~b","C~c","D~d") приемлемо, в то время как переопределениеc("A a","B b","C c","D d") нет (использование последнего определения даетunexpected symbol ошибка при выполненииparse заявление). Возможно, если я неЧтобы использовать символы тильды в именах столбцов, я должен использовать функцию подстановки строк, чтобы заменить все пробелы тильдами передparse заявление?

Ваш ответ на вопрос