です。注釈付きデバッグセッションがあります。それはi
にする必要があります示唆して長さがゼロである明らかに
> myfunction <- function(n,k){
+ if (n==0 | k==0){
+ output <- 0
+ } else if (w[i] > k) {
+ output <- myfunction[i-1,w]
+ } else {
+ output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
+ }
+ return(output)
+ }
> myfunction(4,10)
Error in if (w[i] > k) { : argument is of length zero
どちらワットもK:まず、返されたオブジェクトを修正します。 (エティエンヌも指摘しているように)。あなたのコードを見ると、実際にはi
が終了条件が満たされるまで減少したインデックスになると思われます。だから、登場少数の例でi
でn
を置き換える:
:
> myfunction <- function(i,k){
+ if (i==0 | k==0){
+ output <- 0
+ } else if (w[i] > k) {
+ output <- myfunction[i-1,w]
+ } else {
+ output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
+ }
+ return(output)
+ }
> myfunction(4,10)
Error in myfunction[i - 1, w] :
object of type 'closure' is not subsettable
だから、あなたも(世界の非米国セクションでブラケット別名)括弧が必要とされた角括弧を使用してのミスを犯しました
> myfunction <- function(i,k){
+ if (i==0 | k==0){
+ output <- 0
+ } else if (w[i] > k) {
+ output <- myfunction(i-1,w)
+ } else {
+ output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
+ }
+ return(output)
+ }
> myfunction(4,10)
[1] 90
成功、ほぼ、ほぼ。あなたが条件文の一つに|
代わりの||
を使用しているため、警告のほとんどは、以下のとおりです。
Warning messages:
1: In if (i == 0 | k == 0) { :
the condition has length > 1 and only the first element will be used
2: In if (w[i] > k) { :
the condition has length > 1 and only the first element will be used
3: In if (i == 0 | k == 0) { :
the condition has length > 1 and only the first element will be used
4: In if (i == 0 | k == 0) { :
the condition has length > 1 and only the first element will be used
5: In if (i == 0 | k == 0) { :
the condition has length > 1 and only the first element will be used
6: In if (i == 0 | k == 0) { :
the condition has length > 1 and only the first element will be used
だから、論理||
でそのインスタンスを置き換えます。あなたのロジックを妨害していない他の警告に対処するには、の場合、w[i]
は長さ0であることを認識しているので、最初にその可能性についてテストし、正しい "ダブルAND記号「(&&
):
myfunction <- function(i,k){
if (i==0 || k==0){
output <- 0
} else if (length(w[i]) && w[i] > k) {
output <- myfunction(i-1,w)
} else {
output <- max(v[i]+ myfunction(i-1, k-w[i]), myfunction(i-1,k))
}
return(output)
}
今、あなたが得る:
> myfunction(4,10)
[1] 90
をあなたは 'リターン(MyFunctionを)' 'リターン(出力)'を使用してはいけません。また、関数で 'i'を使用していますが、定義されていないため、関数を修正する必要があります。 – etienne