2013-06-14 2 views
5

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

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

Это кажется маловероятным из-за способом R разбирает переключатель заявление в виде функции, но я надеюсь, что разработчики R проявили особую осторожность при разборе оператора switch, чтобы разрешить несколько аргументов ссылаться на один и тот же блок кода.

+0

, как вы говорите о функции 'switch' не имеет большого смысла для меня, можете ли вы представить небольшой пример, пожалуйста, что иллюстрирует то, что вы пытаетесь сделать? – joran

+0

Не уверен, что я следую, но создание функции с вашим желаемым блоком кода выполнит это в прямом и R-ish пути. – Justin

+0

@joran он хочет что-то похожее на переключатель C, который имеет «проваливающееся» поведение, если не добавлен явный «break». IIRC, это, как правило, считается плохим, хотя люди кодировали некоторые дьявольские хаки с ним. Кроме того, {{цитирование необходимо}} на утверждение, что переключатель быстрее, чем если. –

ответ

7

Обеспечивает назвал аргументы без ценностей, они проваливаются к следующему выражению со значением

> switch("A", A=, B=, C="A OR B OR C", "Other") 
[1] "A OR B OR C" 
> switch("C", A=, B=, C="A OR B OR C", "Other") 
[1] "A OR B OR C" 
> switch("D", A=, B=, C="A OR B OR C", "Other") 
[1] "Other" 

Это описано на странице справки ?switch

If 'EXPR' evaluates to a character string then that string is 
matched (exactly)to the names of the elements in '...'. If there 
is a match then that element is evaluated unless it is missing, in 
which case the next non-missing element is evaluated, so for 
example 'switch("cc", a = 1, cc =, cd =, d = 2)' evaluates to '2'. 
+1

Спасибо. Я предположил, что они не работают так, потому что в Java вам нужен явный 'break' для того, чтобы они не попадали в следующее выражение; отсутствие перерывов побудило меня поверить, что в Р. всегда не проваливается. –

Смежные вопросы