Я думаю, это то, что вы ищете
Этот шаг - это просто создание ваших данных.
Me <- c(1,82,98)
You <- c(4,0,2)
They <- c(6,5,5)
Him <- c(3,4,2)
She <- c(233,122,99)
df <- as.data.frame(cbind(Me, You, They, Him, She))
Это то, что вы хотите.
df[, sapply(df, mean) > 60]
Комбинация apply
и bitmap
не работает вместе, потому что bitmap
не является функцией. Обратите внимание, что запись в документации на bitmap
говорит «Синтаксис», а не «процедура».
Если f
является функцией, тогда (apply f (list a b c))
вычислит (f a b c)
. Однако bitmap
не является функцией, это «специальная форма».
Вы в удаче, потому что bitmap/file
- это функция, поэтому вы можете использовать это.
Вы используете это неправильно. Таким образом, за переменной +
существует объект процедуры, который можно применить. Они равны:
(+ (* 2 3) 5) ; ==> 11
(apply + (list (* 2 3) 5)) ; ==> 11
(apply + `(,(* 2 3) 5)) ; ==> 11
В вашем примере вы используете bitmap
, и это совсем не процедура, а макрос, и кажется, что он должен получать растровые изображения из пакета ракетки и со строками он ожидает хотя бы косой черты, поскольку изображения должны быть в корне пакета. Вы должны заменить его на bitmap/file
, который является процедурой, и вместо этого делает путь к файлу абсолютным или относительным к текущему рабочему каталогу.
В вашем примере (apply `(bitmap/file ,filename)
, который вы передаете, применяется список как первый аргумент вместо объекта процедуры и последний аргумент с параметрами.
В вашем примере (apply bitmap/file `(filename))
вы применяете bitmap
с литеральным списком с символом filename
, который не имеет ничего общего с делать с переменной с тем же именем. Вы были так близки, так как я думаю, что вы хотели (apply bitmap/file `(,filename))
, что является забавным способом сделать (apply bitmap/file (list filename))
. Я не понимаю, почему вы не можете просто сделать это:
(define (get_img filename)
(let ([img (bitmap/file filename)])
(image->color-list mask)))
(apply bitmap (list filename))
не совсем сработало
– paul_graham_for_president
14 July 2018 в 02:27
Я думаю, что стоит понять, что apply
полезно для Racket или других Lisp-1. Почти во всех кодах полезно, когда у вас есть функция и множество аргументов, но вы не знаете, сколько их есть, и вы хотите вызвать функцию с этими аргументами. На практике это означает:
Если вы знаете, сколько аргументов у вас есть, почти никогда не будет причины использовать apply
, если аргументы уже список, и вы не хотите его извлекать: (apply cons l)
может быть проще, чем (cons (first l) (second l))
.
В частности, если вы пытаетесь вызвать функцию с одним аргументом, который вы знаете, тогда apply
определенно не то, что вы хотите. И аналогично, это не то, что вы хотите, если «функция» - это макрос.
В Lisp-2 есть дополнительное использование для apply
: вызов функции, которая является значением a переменная. Это необходимо, потому что, как глупый пример, (let ((x (lambda (...) ...))) ... (x ...) ...)
не будет работать в Lisp-2. Lisp-2s имеют дополнительную функцию funcall
, которая делает то, что делает apply
, когда вы знаете количество аргументов: вам не нужно funcall
в Lisp-1.
Случаи, когда eval
полезны, еще реже. Есть некоторые, но почти все время это, в лучшем случае, путаница и, в худшем случае, страшная проблема безопасности: что делает
(define (terror x) (eval `(list x)))
Do, когда он называется? Ответ: что-нибудь вообще, что язык способен делать : (terror '(launch-the-nukes))
, скажем.