Конструктивные решения для поведения по умолчанию R настраиваются для интерактивного использования, но могут приводить к нежелательному поведению в больших кодовых файлах без большого контроля над пользователем. Мне было бы интересно найти способы сделать язык более строгим. У меня есть два основных примера.изменение поведения по умолчанию оператора
(рециклинг) Non-конгруэнтные векторы перерабатывается в arythmetic операции:
> x=1:10
> y=1:20
> y=rep(1,20)
> x+y
[1] 2 3 4 5 6 7 8 9 10 11 2 3 4 5 6 7 8 9 10 11
Есть ли способ, чтобы сделать эту операцию результат ошибки?
(преобразование) преобразования происходит при обновлении векторов, иногда изменяя тип элемента обновляются, иногда типа вектора:
> x[1] <- 'a'
> x
[1] "a" "2" "3" "4" "5" "6" "7" "8" "9" "10"
> x[1] <- 1
> x
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
Есть ли способ, чтобы сделать эту операцию привести к ошибка?
Я считаю, что большая часть разочарования новых и промежуточных пользователей связана с такими поведением (что, в свою очередь, приводит к суждению судейства на языке!). Весьма приветствуется любой указатель на общие подходы к обращению с рециркуляцией и конверсией.
Утилизация и преобразование являются основными свойствами языка. Оба они реализованы на уровне C. Имхо, меняющий это вообще, потребовал бы изменения базового исходного кода и восстановления R. Это было бы нетривиальной задачей и, как можно ожидать, нарушит многие и многие другие функции. Вы могли бы, например, написать '+' методы для некоторого класса, которые проверяют, имеет ли вход одинаковой длины, но будут значительные затраты на производительность, и у вас, кажется, есть что-то более общее. – Roland
Что Роланд сказал правильно, и вам не следует испортить оригинальные функции, но вы можете создать свою собственную подобную функцию без больших потерь в производительности, например '' '' "% +%" <- function (x, y) {stopifnot (length (x) == length (y)); '+' (x, y)} '' '', тогда вы можете протестировать его с помощью 'x% +% y' –
. Для утилизации вы можете посмотреть [этот вопрос и его комментарии] (http://stackoverflow.com/questions/9424976/безусловное-предупреждение, когда рециркуляция). Похоже, что эту базовую функцию R невозможно изменить. – agstudy