Каков самый большой R-глюк, на который Вы натыкались?

Я посмотрел бы GetModuleHandleEx() использование флага GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS. Похоже, что можно изменить Ваш GetCurrentModule(), чтобы назвать эту стандартную программу вместо VirtualQuery() и передать адрес GetCurrentModule() как lpModuleName аргумент.

ETA:

const HMODULE GetCurrentModule()
{
    DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS;
    HMODULE hm = 0;
    ::GetModuleHandleEx( flags, reinterpret_cast<LPCTSTR>( GetCurrentModule ), &hm );   
    return hm;
}

я не попробовал его, но я думаю, что это сделает то, что Вы хотите.

57
задан Braiam 5 March 2017 в 07:05
поделиться

12 ответов

Удаление строки во фрейме данных вызовут добавление строк с неуникальными именами, которые затем выдадут ошибку:

> a<-data.frame(c(1,2,3,4),c(4,3,2,1))
> a<-a[-3,]
> a
  c.1..2..3..4. c.4..3..2..1.
1             1             4
2             2             3
4             4             1
> a[4,1]<-1
> a
Error in data.frame(c.1..2..3..4. = c("1", "2", "4", "1"), c.4..3..2..1. = c(" 4",  : 
  duplicate row.names: 4

Итак, что происходит здесь:

  1. Создается четырехстрочный data.frame, поэтому имена строк c (1 , 2,3,4)

  2. Третья строка удаляется, поэтому имена строк - c (1,2,4)

  3. Добавляется четвертая строка, и R автоматически устанавливает имя строки, равное индексу, т.е. 4 , поэтому имена строк - c (1,2,4,4). Это недопустимо, потому что имена строк должны быть уникальными. Я не понимаю, почему этот тип поведения должен быть разрешен R. Мне кажется, что R должен предоставлять уникальное имя строки.

32
ответ дан 7 November 2019 в 05:41
поделиться
  1. случайно перечислить исходный код функции, забыв включить пустые круглые скобки: например, «ls» или «ls ()»

  2. true и false не сокращайте это как предопределенные константы , как в Matlab, C ++, Java, Python; должны использовать невидимые возвращаемые значения TRUE & FALSE

  3. : например, «.packages ()» ничего не возвращает, а «(.packages ())» возвращает вектор символов базовых имен пакетов

6
ответ дан 7 November 2019 в 05:41
поделиться

Всегда проверяйте, что происходит, когда у вас NA !

Одна вещь, на которую мне всегда нужно обращать пристальное внимание (после многих болезненных переживаний), - это ценности NA . Функции R просты в использовании, но никакие методы программирования не помогут решить проблемы с вашими данными.

Например, любая чистая векторная операция с NA равна NA . На первый взгляд это «удивительно»:

> x <- c(1,1,2,NA)
> 1 + NA
[1] NA
> sum(x)
[1] NA
> mean(x)
[1] NA

Это экстраполируется на другие функции более высокого уровня.

Другими словами, пропущенные значения часто имеют такое же значение, как и измеренные значения по умолчанию . Многие функции имеют na.rm = TRUE / FALSE по умолчанию; стоит потратить некоторое время на то, чтобы решить, как интерпретировать эти настройки по умолчанию.

Редактировать 1: Марек отлично замечает. Значения NA также могут вызывать запутанное поведение в индексах. Например:

> TRUE && NA
[1] NA
> FALSE && NA
[1] FALSE
> TRUE || NA
[1] TRUE
> FALSE || NA
[1] NA

Это также верно, когда вы пытаетесь создать условное выражение (для оператора if):

> any(c(TRUE, NA))
[1] TRUE
> any(c(FALSE, NA))
[1] NA
> all(c(TRUE, NA))
[1] NA

Когда эти значения NA превращаются в ваши векторные индексы, может последовать много неожиданных вещей. Все это хорошее поведение для R, потому что это означает, что вы должны быть осторожны с пропущенными значениями. Но вначале это может вызвать серьезные головные боли.

18
ответ дан 7 November 2019 в 05:41
поделиться

Забыть, что strptime () и друзья возвращают POSIXt POSIXlt , где length () всегда равно девяти - преобразование в POSIXct помогает:

R> length(strptime("2009-10-07 20:21:22", "%Y-%m-%d %H:%M:%S"))
[1] 9
R> length(as.POSIXct(strptime("2009-10-07 20:21:22", "%Y-%m-%d %H:%M:%S")))
[1] 1
R> 
13
ответ дан 7 November 2019 в 05:41
поделиться

Забыть аргумент drop = FALSE в подмножестве матриц до одномерного и тем самым отбросить класс объекта:

R> X <- matrix(1:4,2)
R> X
     [,1] [,2]
[1,]    1    3
[2,]    2    4
R> class(X)
[1] "matrix"
R> X[,1]
[1] 1 2
R> class(X[,1])
[1] "integer"
R> X[,1, drop=FALSE]
     [,1]
[1,]    1
[2,]    2
R> class(X[,1, drop=FALSE])
[1] "matrix"
R> 
32
ответ дан 7 November 2019 в 05:41
поделиться

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

Если что-то неожиданно пойдет не так в вашем R-скрипте, проверьте, не виноваты ли факторы.

35
ответ дан 7 November 2019 в 05:41
поделиться

Coming from compiled language and Matlab, I've gotten occasionally confused about a fundamental aspect of functions in functional languages: they have to be defined before they're used! It's not enough just for them to be parsed by the R interpreter. This mostly rears its head when you use nested functions.

In Matlab you can do:

function f1()
  v1 = 1;
  v2 = f2();
  fprintf('2 == %d\n', v2);

  function r1 = f2()
    r1 = v1 + 1 % nested function scope
  end
end

If you try to do the same thing in R, you have to put the nested function first, or you get an error! Just because you've defined the function, it's not in the namespace until it's assigned to a variable! On the other hand, the function can refer to a variable that has not been defined yet.

f1 <- function() {
  f2 <- function() {
    v1 + 1
  }

  v1 <- 1

  v2 = f2()

  print(sprintf("2 == %d", v2))
}
3
ответ дан 7 November 2019 в 05:41
поделиться

Например, число 3,14 - это числовая константа, а выражения +3,14 и -3,14 - это вызовы функций + и - :

> class(quote(3.14))
[1] "numeric"
> class(quote(+3.14))
[1] "call"
> class(quote(-3.14))
[1] "call"

См. Раздел 13.2 в книге Джона Чемберса Программное обеспечение для анализа данных - Программирование с помощью R

5
ответ дан 7 November 2019 в 05:41
поделиться

[Хэдли указал на это в комментарии .]

При использовании последовательности в качестве индекса для итерации лучше использовать seq_along () функция, а не что-то вроде 1: length (x) .

Здесь я создаю вектор, и оба подхода возвращают одно и то же:

> x <- 1:10
> 1:length(x)
 [1]  1  2  3  4  5  6  7  8  9 10
> seq_along(x)
 [1]  1  2  3  4  5  6  7  8  9 10

Теперь сделайте вектор NULL :

> x <- NULL
> seq_along(x) # returns an empty integer; good behavior
integer(0)
> 1:length(x) # wraps around and returns a sequence; this is bad
[1] 1 0

Это может вызвать некоторую путаницу в цикле:

> for(i in 1:length(x)) print(i)
[1] 1
[1] 0
> for(i in seq_along(x)) print(i)
>
42
ответ дан 7 November 2019 в 05:41
поделиться

У меня с сегодняшнего дня: qnorm () принимает Вероятности, а pnorm () принимает Квантили.

3
ответ дан 7 November 2019 в 05:41
поделиться

Во-первых, позвольте мне сказать, что я понимаю фундаментальные проблемы представления чисел в двоичной системе. Тем не менее, одна проблема, которую, как мне кажется, можно легко улучшить, - это представление чисел, когда десятичное значение выходит за рамки типичного объема представления R.

x <- 10.2 * 100
x
1020
as.integer(x)
1019

Я не возражаю, если результат будет представлен как целое число, хотя его действительно можно представить как целое число. Например, если значение действительно было 1020, тогда можно было бы распечатать это для x. Но что-то столь же простое, как 1020.0 в этом случае при выводе x, сделало бы более очевидным, что значение не является целым числом и не может быть представлено как единое целое. R должен по умолчанию использовать какую-то индикацию, когда отсутствует чрезвычайно маленький десятичный компонент.

23
ответ дан 7 November 2019 в 05:41
поделиться

Может раздражать необходимость разрешать комбинации NA , NaN и Inf . Они ведут себя по-разному, и тесты для одного не обязательно будут работать для других:

> x <- c(NA,NaN,Inf)
> is.na(x)
[1]  TRUE  TRUE FALSE
> is.nan(x)
[1] FALSE  TRUE FALSE
> is.infinite(x)
[1] FALSE FALSE  TRUE

Однако самый безопасный способ проверить любого из этих нарушителей спокойствия:

> is.finite(x)
[1] FALSE FALSE FALSE
20
ответ дан 7 November 2019 в 05:41
поделиться