R - Избегание циклов с автоматической итерацией - PullRequest
5 голосов
/ 29 апреля 2011

Это надуманный пример, который я использую, чтобы надеяться лучше понять R.Допустим, я хочу поместить в символьный вектор «test».Я хочу вернуть каждое значение элемента от третьего символа до последнего символа.Это не работает:

test = c( "Jane" , "Jerry" , "Joan" )
substr( test , 3 , length( test ) )
expecting: "ne" , "rry" , "an"

Есть ли способ сделать это без цикла for?

1 Ответ

10 голосов
/ 29 апреля 2011

Используйте nchar().Это векторизация:

> test = c( "Jane" , "Jerry" , "Joan" )
> substr( test , 3 , nchar( test ) )
[1] "ne"  "rry" "an" 

Учитывая, что nchar будет возвращать вектор длин, и что substr также векторизован, и поэтому ожидает работы с векторными аргументами, одна потенциальная загадка - почему он даже принимает скалярный аргумент3.Ответ здесь заключается в том, что скаляры для аргументов start и stop повторно используются для соответствия длине входного вектора символов.Таким образом, вы можете даже использовать 1: 2 в качестве аргумента начала и получать чередующиеся полные и почти полные строки:

>      substr( test , 1:2 , nchar( test ) )
[1] "Jane" "erry" "Joan"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...