Почему простая пользовательская функция дает разные результаты для разных имен переменных. 'c' v / s 'k' - PullRequest
0 голосов
/ 28 апреля 2018

Я создал следующую функцию:

math_funct <- function(a ,b){  
  c <<- a+b
  print(c)

  d <<- a-b
  print(d)

  e = c*d  
  print(e)  
}

И когда я вызываю его с входными параметрами 10 и 20, я получаю следующую ошибку о переменной 'c':

math_funct(a=10, b=20)

Error in math_funct(a = 10, b = 20) : 
cannot change value of locked binding for 'c'

Однако, когда я запускаю ту же самую функцию, заменяя 'c' произвольно выбранным именем переменной 'k', она работает просто отлично.

math_funct <- function(a ,b){  
k <<- a+b
print(k)

d <<- a-b
print(d)

e = k*d  
print(e)  
}

math_funct(a=10, b=20)
[1] 30
[1] -10
[1] -300

1 Ответ

0 голосов
/ 28 апреля 2018

Когда вы делаете c <<- a+b, вы делаете глобальное присваивание, которое, в свою очередь, пытается перезаписать c, который изначально - функция для объединения значений в вектор или список .

Это объясняет:

когда я запускаю ту же самую функцию, заменяя 'c' произвольно выбранным именем переменной 'k', она работает просто отлично.

А также объясняет ошибку, которую вы получаете: cannot change value of locked binding for 'c'. Если вы попытаетесь глобально присвоить значение от 5 до t, еще одной функции R (для транспонирования), вы получите ту же ошибку.

t <<- 5
Error: cannot change value of locked binding for 't'
...