我是不正确地使用了sapply?

时间:2015-06-22 20:29:44

标签: r sapply

这段代码假定接受一个单词,并根据单词中字母的位置计算单词字母的值。所以对于像“破碎”这样的词,它假设计算字母“r”和“k”的值

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 )))

}

然而,对于“破产”,我得到的只是计算“k”的值和其他一些东西:

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

虽然所需的输出应该是“r”和“k”的值,所以类似于:

[1] "2 L 0.61666666"
[1] "4 L 0.51666666" 

我做错了什么?我错误地使用sapply了吗?

2 个答案:

答案 0 :(得分: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 = " "))

我假设您要将结果输出到控制台。

答案 1 :(得分:1)

您正在使用sapply更正,您遇到的错误是其中的功能。您想要的是i变量的other.letts元素,而不是oth_let1oth_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 ))))