2015-03-12 4 views
5

Конструктивные решения для поведения по умолчанию 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" 

Есть ли способ, чтобы сделать эту операцию привести к ошибка?

Я считаю, что большая часть разочарования новых и промежуточных пользователей связана с такими поведением (что, в свою очередь, приводит к суждению судейства на языке!). Весьма приветствуется любой указатель на общие подходы к обращению с рециркуляцией и конверсией.

+1

Утилизация и преобразование являются основными свойствами языка. Оба они реализованы на уровне C. Имхо, меняющий это вообще, потребовал бы изменения базового исходного кода и восстановления R. Это было бы нетривиальной задачей и, как можно ожидать, нарушит многие и многие другие функции. Вы могли бы, например, написать '+' методы для некоторого класса, которые проверяют, имеет ли вход одинаковой длины, но будут значительные затраты на производительность, и у вас, кажется, есть что-то более общее. – Roland

+1

Что Роланд сказал правильно, и вам не следует испортить оригинальные функции, но вы можете создать свою собственную подобную функцию без больших потерь в производительности, например '' '' "% +%" <- function (x, y) {stopifnot (length (x) == length (y)); '+' (x, y)} '' '', тогда вы можете протестировать его с помощью 'x% +% y' –

+0

. Для утилизации вы можете посмотреть [этот вопрос и его комментарии] (http://stackoverflow.com/questions/9424976/безусловное-предупреждение, когда рециркуляция). Похоже, что эту базовую функцию R невозможно изменить. – agstudy

ответ

0

Для добавления. Дэвид прав. На разумной коде проверить этот вид вещей на входе функции или, по крайней мере, в конце:

require(testthat) 
    expect_equal(length(out), length (mainEntry)) 

Преобразования также является очень чувствительным вопрос. В важном коде я указываю тип в назначении:

X[1] <- as.numeric("a") 

Поднимет предупреждение. Вы можете даже определить классы, запрещающие конверсии, используя S4 classes.

К сожалению, для новичков это, возможно, не легче, но если новички должны обрабатывать критический код в любом случае?

Смежные вопросы