我是否错误地使用了 sapply?
Am I using sapply incorrectly?
这段代码假设接受一个单词,并根据单词中字母的位置计算单词字母的值。所以对于像 "broke" 这样的词,它应该计算字母 "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 )))
}
但是对于 "broke" 我得到的只是计算 "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
不正确吗?
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 = " "))
我假设您想将结果输出到控制台。
你使用的sapply
是正确的,你错的是它里面的函数。您想要的是 other.letts
变量的 i
元素,而不是来自 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 ))))
这段代码假设接受一个单词,并根据单词中字母的位置计算单词字母的值。所以对于像 "broke" 这样的词,它应该计算字母 "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 )))
}
但是对于 "broke" 我得到的只是计算 "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
不正确吗?
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 = " "))
我假设您想将结果输出到控制台。
你使用的sapply
是正确的,你错的是它里面的函数。您想要的是 other.letts
变量的 i
元素,而不是来自 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 ))))