2015-06-22 5 views
0

Этот код должен взять слово и вычислить значения для букв слова в зависимости от положения буквы в слове. Так слово как «сломал» это, предполагают, чтобы вычислить значения для буквы «г» и «К»Я использую sapply неправильно?

strg <- 'broke' 

#this part stores everything except the first, 
#last, and middle position of the word 

strg.leng <- nchar(strg) 

other.letts <- sequence(strg.leng) 

if (length(other.letts) %% 2 != 0) { 

    oth_let1 <- other.letts[-c(1, ceiling(length(other.letts)/2), length(other.letts))] 

} else { 

    oth_let0 <- other.letts[-c(1, c(1,0) + floor(length(other.letts)/2), length(other.letts))] 

} 

print(paste("Values of the other letters of: ", strg)) 

#here is where the computation starts, taking in the objects created above 

if ((nchar(strg) %% 2) != 0) { 

    sapply(oth_let1, function(i) print(paste(oth_let1[i], "L", (.66666*1.00001) - (oth_let1[i] - 1) *.05))) 

} else { 

    sapply(oth_let0, function(i) print(paste(oth_let0[i], "L", (.66666*1.00001) - (oth_let0[i] - 1) *.05))) 

} 

Однако для «сломал» Я получаю это который только вычисления значения «к» и некоторые другие вещи:

[1] "4 L 0.5166666666" 
[1] "NA L NA" 
[1] "4 L 0.5166666666" "NA L NA" 

Хотя желаемый результат должен быть значение как для «г» и «к», так что-то вроде:

Что я делаю неправильно? Использую ли я sapply неправильно?

+0

Почему вы используете 'oth_let0 [i]'? Это должно быть просто 'i'. И 'if else' там избыточен. Вы должны просто поместить один sapply (и использовать одну переменную вместо двух: 'oth_let0' и' oth_let1'). И загляните в [this] (http://stackoverflow.com/questions/19480652/sapply-in-r-why-returns-input) для понимания последнего. – m0nhawk

ответ

2

sapply выполняет итерацию через прилагаемый вектор или список и поставляет каждый член по очереди на функцию. В вашем случае вы получаете значения 2 и 4, а затем пытаетесь снова индексировать свой вектор, используя свои собственные значения. Поскольку вектор oth_let1 имеет только два члена, вы получаете NA. Вы можете исправить свой текущий код, заменив oth_let1[i] на i. Однако ваш код может быть значительно упрощен до:

strg <- 'broke' 
lets <- 2:(nchar(strg) - 1) 
lets <- lets[-(1:2 + length(lets))/2] # removes middle item for odd and middle two for even 
cat("Values of the other letters of:", strg, "\n") 
#here is where the computation starts, taking in the objects created above 
writeLines(paste(lets, "L", 0.66666*1.00001 - (lets - 1) * 0.05, sep = " ")) 

Я предполагаю, что вы хотите выводить результаты на консоль.

+0

Вау, ладно, это безумие, насколько ты упростил это. – Nolohice

1

Вы используете sapply правильно, что вы получаете неправильно, это функция внутри него. Вам нужен элемент i переменной other.letts, а не oth_let1. oth_let1 имеют индексы от other.letts.

Код ниже должен работать, я также изменяю имя переменной на oth_let, поэтому вам не нужно использовать другие if. Для вывода будет то, что вы просите, я использовал функцию invisible.

strg <- 'broke' 
strg.leng <- nchar(strg) 

other.letts <- sequence(strg.leng) 

if(length(other.letts) %% 2 != 0) { 
    oth_let <- other.letts[-c(1, ceiling(length(other.letts)/2), 
         length(other.letts))] 
}else{ 
    oth_let <- other.letts[-c(1, c(1,0) + floor(length(other.letts)/2), 
         length(other.letts))] 
} 

print(paste("Values of the other letters of: ", strg)) 

invisible(sapply(oth_let, 
       function(i) 
       print(paste(other.letts[i], "L", (.66666*1.00001) - (other.letts[i] - 1) *.05)))) 
Смежные вопросы