С rlang
и квазиковацией у нас есть другая опция dplyr. Во-первых, получите имена строк, которые мы хотим вычислить для параллельного max для:
iris_cols <- iris %>% select(Sepal.Length:Petal.Width) %>% names()
. Затем мы можем использовать !!!
и rlang::syms
для вычисления параллельного max для каждой строки этих столбцов:
iris %>%
mutate(mak=pmax(!!!rlang::syms(iris_cols)))
rlang::syms
принимает строковый ввод (имена столбцов) и превращает его в символ !!!
unquotes и связывает его аргумент, здесь столбец имена Что дает:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species mak
1 5.1 3.5 1.4 0.2 setosa 5.1
2 4.9 3.0 1.4 0.2 setosa 4.9
3 4.7 3.2 1.3 0.2 setosa 4.7
4 4.6 3.1 1.5 0.2 setosa 4.6
5 5.0 3.6 1.4 0.2 setosa 5.0
Вы используете класс ^ = "
Если вы посмотрите на документацию, вы увидите, будет ли это атрибут начинается с селектора [name^=”value”]
Это означает, что атрибут должен be
class="value-abc"
Так что это не соответствует вашему случаю, потому что строка не в самом начале. Вам нужно будет использовать Attribute Contains Selector [name*=”value”]
. Другая проблема: ближайший будет захватывать div div и div, который вы ищете, по-прежнему является великим родителем этого div.
$(function() {
$(document).on('click','.addfile', function() {
var elm = $(this).closest('[class*="file-plugin-"]');
console.log(elm.attr("class"));
console.log(elm.attr("class").match(/file-plugin-\d+/)[0])
// how I would do it
var elem = $(this).closest('[data-index]');
console.log(elem.data("index"))
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrap1">
<div class="other class file-plugin-1" data-index="1">
<div class="wrap2">
<div class="input-group-append">
<button type="button" class="remfile">Remove</button>
<button type="button" class="addfile">Add</button>
</div>
</div>
</div>
</div>
Вы можете использовать regex для поиска класса элементов, начиная с определенного текста
$(document).on('click','.addfile', function() {
var Target = $(this).parents().filter((i, ele)=>ele.className.match(/\bfile-plugin-/)).attr('class')
console.log(Target);
});
Проблема в том, что класс div, который вы после буквально не начинаете с "file-plugin-"
, он просто содержит его. Вам нужно изучить атрибут класса вручную, JQuery не помогает с этим (что я знаю).
Что-то вроде этого должно работать:
$(function() {
$(document).on('click','.addfile', function() {
// need to be dinamicaly
var target = $(this).parents("div").filter((_, div) => -1 != div.className.indexOf('file-plugin-'));
// console.log(target[0]);
// Or using the "contains" selector (credit to @epascarello)
target = $(this).parents("div[class*=file-plugin-]");
var string = target.attr("class").split(" ").filter( clazz => clazz.startsWith('file-plugin-'))[0];
console.log(string);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrap1">
<div class="other class file-plugin-1">
<div class="wrap2">
<div class="input-group-append">
<button type="button" class="remfile">Remove</button>
<button type="button" class="addfile">Add</button>
</div>
</div>
</div>
</div>
file-plugin-
может иметь элемент с другими аналогичными классами: «файл-плагин-1», «файл-плагин-2», – walter nuñez 14 July 2018 в 01:55*=
. Если вы использовали общий класс для элементов, вы могли бы просто ссылаться на имя класса, и это было бы более эффективно. – epascarello 14 July 2018 в 01:55