отсутствует х без значения по умолчанию. Вызов функций внутри функций в R - PullRequest
0 голосов
/ 31 марта 2020

Я пишу код для решения головоломки судоку, используя видео , найденное на YouTube, которое кодировало тот же алгоритм с помощью Python. Этот код требует три функции, чтобы

  1. Найти пустой квадрат.
  2. вставить число в пустой квадрат.
  3. Проверить, является ли это число действительным для решения головоломки .

Это использует алгоритм обратного отслеживания для решателя.

У меня проблема при вызове функций вместе, где я получаю сообщение об ошибке:

Error in free_squ(x) : argument "x" is missing, with no default
In addition: Warning message:
In if (empty_sq == FALSE) { :
the condition has length > 1 and only the first element will be used
Called from: free_squ(x)

Это сбивает с толку, так как я получаю это только при запуске этого кода. Поэтому я могу написать другие функции для вызова отдельных функций для анализа аргумента, вставленного в вышележащую функцию:

function1(argument){
   function2(argument){
     function3(argument){
        ***DO STUFF***}}}

Почему для следующего кода функция внутри главной функции не распознает аргумент?

sudoku_solve <- function(x){

  empty_sq <- free_squ(x) # Define a new object to give coordinates of empty square

  if(empty_sq == FALSE){ # If no empty square can be found

    return(x) # Return the matrix

  } else{

    empty_sq <- empty_sq  # Pointless line kept for clarity

  }
  for(i in c(1:9)){ # Integers to insert into the found empty square

    if(valid(x, i, empty_sq) == TRUE){ # can the intiger be placed in this square?

      x[empty_sq[1], empty_sq[2]] = i # if i valid, insert into empty square
    } 


    if(sudoku_solve()){ # are all i's valid?

      return(TRUE) # All i's valid

    } else{

      x[empty_sq[1], empty_sq[2]] = 0 # reset the initial try and try again with another
    }
}
  return(FALSE)
  }

Я назвал головоломку судоку «загадкой» и вызываю функцию следующим образом:

sudoku_solve(puzzle)

1 Ответ

1 голос
/ 31 марта 2020

Я думаю, что в следующем утверждении вы не передаете никакое значение функции, и x также не имеет значения по умолчанию.

if(sudoku_solve()){ # are all i's valid?
    return(TRUE) # All i's valid
}

Следовательно, хотя аргумент первоначально передается, когда функция вызывается снова после l oop, она вызывается без аргумента. Итак, вы переходите к free_sq (x) внутри sudoku_solve (), и это выдает ошибку.

empty_sq <- free_squ(x)

Убедитесь, что вы передаете значение в sudoku_solve, или же установите значение по умолчанию для x с помощью sudoku_solve или в классе / функции free_squ.

...