Элегантный способ добавить кучу похожих ячеек данных в ячейку в R?

Вам нужно разделить взаимодействия onBindViewHolder (логические) с CheckBox и взаимодействия с пользователем с помощью флажка. Я использовал OnCheckedChangeListener для пользовательских взаимодействий (очевидно) и ViewHolder.bind () для логики, поэтому вам нужно установить проверенный прослушиватель на нуль до настройки держателя и после того, как владелец готов - настроить проверочный прослушиватель для пользовательских взаимодействий.

boolean[] checkedStatus = new boolean[numberOfRows];

@Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        final ViewHolderItem itemHolder = (ViewHolderItem) holder;

        //holder.bind should not trigger onCheckedChanged, it should just update UI
        itemHolder.checkBox.setOnCheckedChangeListener(null);

        itemHolder.bind(position);

        itemHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    checkedStatus[holder.getAdapterPosition()] = true;
                    performCheckedActions(); //your logic here
                } else {
                    checkedStatus[holder.getAdapterPosition()] = false;
                    performUncheckedActions(); //your logic here
                }
            }
        });
    }

public void bind(int position) {
            boolean checked = checkedStatus[position];
            if (checked) {
                checkBox.setChecked(false);
            } else {
                checkBox.setChecked(true);
            }
        }
4
задан steveb 13 July 2018 в 23:52
поделиться

2 ответа

Вы можете использовать apply после изменения данных в нужные размеры: например:

i=nrow(dfs[[1]])
j=ncol(dfs[[1]])
k=length(dfs)
apply(array(unlist(dfs),c(i,j,k)),c(1,2),sum)

     [,1] [,2] [,3] [,4]
[1,] 29.3 15.7 17.6  5.3
[2,] 29.1 16.3 18.3  6.4
[3,] 27.9 15.1 15.6  4.4

, если вы хотите, чтобы среднее:

apply(array(unlist(dfs),c(i,j,k)),c(1,2),mean)

     [,1] [,2] [,3] [,4]
[1,] 5.86 3.14 3.52 1.06
[2,] 5.82 3.26 3.66 1.28
[3,] 5.58 3.02 3.12 0.88

, если вы хотите max:

apply(array(unlist(dfs),c(i,j,k)),c(1,2),max)
     [,1] [,2] [,3] [,4]
[1,]  7.2  3.6  6.1  2.5
[2,]  6.9  3.8  5.7  2.3
[3,]  6.1  3.5  4.9  1.8

Вы можете выполнить любую функцию, которая возвращает итоговое значение

data.frame(apply(array(unlist(dfs),c(i,j,k)),c(1,2),paste0,collapse=","))
                   X1                  X2                X3                  X4
1   4.8,7.2,6,6.4,4.9 3.1,3.6,2.2,3.2,3.6 1.6,6.1,4,4.5,1.4   0.2,2.5,1,1.5,0.1
2 4.6,6.9,5.8,5.1,6.7   3.6,3.2,2.7,3.8,3   1,5.7,5.1,1.5,5 0.2,2.3,1.9,0.3,1.7
3 4.8,5.8,5.5,6.1,5.7   3.4,2.6,3.5,3,2.6 1.9,4,1.3,4.9,3.5   0.2,1.2,0.2,1.8,1
4
ответ дан Onyambu 17 August 2018 в 12:06
поделиться
  • 1
    @Moody_Mudskipper, возвращающие значение – Onyambu 13 July 2018 в 23:48
  • 2
    @Moody_Mudskipper не совсем, просто любая функция, которая возвращает одно значение. например. max принимает только вектор. max не принимает ..., но возвращает одно значение – Onyambu 13 July 2018 в 23:58
  • 3
    @Moody_Mudskipper уверен, что функция должна принимать вектор или многоточие и возвращать значение – Onyambu 14 July 2018 в 00:02
  • 4
    Я очистил комментарии здесь и на другом посту, я полагаю, что укладка данных в рамки третьего измерения и применение функции на нем так же, как и вы, - это то, что наиболее важно в качестве общего ответа. Преобразования data.frame немного неудобны, но я не вижу пути вокруг них. – Moody_Mudskipper 14 July 2018 в 00:22

Вы можете использовать Reduce:

Reduce(`+`, dfs)
#     Sepal.Length Sepal.Width Petal.Length Petal.Width
# 122         28.0        13.2         18.7         6.1
# 87          26.8        14.9         15.1         4.5
# 100         30.8        14.6         23.1         7.7

В этом случае это просто, потому что + добавляет элемент lhs и rhs мудрый, с векторизованными функциями (например, paste) вы можете использовать:

data.frame(Reduce(function(x,y) Map(paste,x,y), dfs))
#          Sepal.Length         Sepal.Width        Petal.Length       Petal.Width
# 1     5.6 6.2 5 5.2 6 2.8 2.2 3.3 2.7 2.2   4.9 4.5 1.4 3.9 4   2 1.5 0.2 1.4 1
# 2   6.7 4.6 4.6 5.9 5   3.1 3.4 3.1 3 2.3 4.7 1.4 1.5 4.2 3.3 1.5 0.3 0.2 1.5 1
# 3 5.7 5.8 6.7 6.1 6.5   2.8 2.7 3.3 3 2.8 4.1 4.1 5.7 4.6 4.6 1.3 1 2.5 1.4 1.5

данных

dfs<-list()
for (i in 1:5) {
  dfs[[i]]<-iris[sample(1:nrow(iris),3),-5]
}
8
ответ дан Moody_Mudskipper 17 August 2018 в 12:06
поделиться
  • 1
    Как я получу среднее использование этого? Или, скажем, другую более сложную функцию? – Steve austin 13 July 2018 в 23:22
  • 2
    @Steveaustin, если это все числовые данные, поместите их в массив и используйте apply. – Gregor 13 July 2018 в 23:25
  • 3
    среднее - сумма / длина ..... т. е. Reduce("+",dfs)/length(dfs) – Onyambu 13 July 2018 в 23:31
  • 4
    что вы имеете в виду? – Onyambu 13 July 2018 в 23:33
  • 5
    Что вы подразумеваете под списком? – Onyambu 13 July 2018 в 23:36
Другие вопросы по тегам:

Похожие вопросы: