Как исправит ошибку invalid type for

  • Редакция Кодкампа

17 авг. 2022 г.
читать 2 мин


Одна ошибка, с которой вы можете столкнуться в R:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
 invalid type (list) for variable 'x'

Эта ошибка обычно возникает, когда вы пытаетесь подобрать регрессионную модель или модель ANOVA в R и используете список для одной из переменных вместо вектора .

В этом руководстве рассказывается, как исправить эту ошибку на практике.

Как воспроизвести ошибку

Предположим, я пытаюсь подогнать простую модель линейной регрессии в R:

#define variables
x <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#attempt to fit regression model
model <- lm(y ~ x)

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
 invalid type (list) for variable 'x'

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

Как избежать ошибки

Самый простой способ избежать этой ошибки — просто использовать функцию unlist() для преобразования переменной списка в вектор:

#define variables
x <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#attempt to fit regression model
model <- lm(y ~ unlist(x))

#view the model output
summary(model)

Call:
lm(formula = y ~ unlist(x))

Residuals:
 Min 1Q Median 3Q Max 
-1.1282 -0.4194 -0.1087 0.2966 1.7068 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 6.58447 0.55413 11.88 2.31e-06 ***
unlist(x) 1.70874 0.06544 26.11 4.97e-09 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8134 on 8 degrees of freedom
Multiple R-squared: 0.9884, Adjusted R-squared: 0.987 
F-statistic: 681.8 on 1 and 8 DF, p-value: 4.97e-09

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

Обратите внимание, что если вы подгоняете модель множественной линейной регрессии и у вас есть несколько переменных-предикторов, которые в настоящее время являются объектами списка, вы можете использовать unlist() для преобразования каждого из них в векторы перед подгонкой модели регрессии:

#define variables
x1 <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
x2 <- list(20, 16, 16, 15, 16, 12, 10, 8, 8, 4)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#fit multiple linear regression model
model <- lm(y ~ unlist(x1) + unlist(x2))

#view the model output
summary(model)

Call:
lm(formula = y ~ unlist(x1) + unlist(x2))

Residuals:
 Min 1Q Median 3Q Max 
-1.1579 -0.4211 -0.1386 0.3108 1.7130 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 8.34282 4.44971 1.875 0.102932 
unlist(x1) 1.61339 0.24899 6.480 0.000341 ***
unlist(x2) -0.08346 0.20937 -0.399 0.702044 
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8599 on 7 degrees of freedom
Multiple R-squared: 0.9887, Adjusted R-squared: 0.9854 
F-statistic: 305.1 on 2 and 7 DF, p-value: 1.553e-07

Мы снова не получаем никаких ошибок, так как мы преобразовали каждый из объектов списка в векторы.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в R:

Как интерпретировать вывод glm в R
Как интерпретировать результаты ANOVA в R
Как обращаться с предупреждением R: glm.fit: алгоритм не сошелся


One error you may encounter in R is:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'x' 

This error usually occurs when you attempt to fit a regression model or an ANOVA model in R and use a list for one of the variables instead of a vector.

This tutorial shares how to fix this error in practice.

How to Reproduce the Error 

Suppose I attempt to fit a simple linear regression model in R:

#define variables
x <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#attempt to fit regression model
model <- lm(y ~ x)

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'x'

I receive an error because the lm() function can only take vectors as input and the x variable is currently a list.

How to Avoid the Error

The easiest way to avoid this error is to simply use the unlist() function to convert the list variable to a vector:

#define variables
x <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#attempt to fit regression model
model <- lm(y ~ unlist(x))

#view the model output
summary(model)

Call:
lm(formula = y ~ unlist(x))

Residuals:
    Min      1Q  Median      3Q     Max 
-1.1282 -0.4194 -0.1087  0.2966  1.7068 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  6.58447    0.55413   11.88 2.31e-06 ***
unlist(x)    1.70874    0.06544   26.11 4.97e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8134 on 8 degrees of freedom
Multiple R-squared:  0.9884,	Adjusted R-squared:  0.987 
F-statistic: 681.8 on 1 and 8 DF,  p-value: 4.97e-09

Notice that we’re able to fit the simple linear regression model without any errors this time because we used unlist() to convert variable x to a vector.

Note that if you’re fitting a multiple linear regression model and you have multiple predictor variables that are currently list objects, you can use unlist() to convert each of them to vectors before fitting the regression model:

#define variables
x1 <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
x2 <- list(20, 16, 16, 15, 16, 12, 10, 8, 8, 4)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#fit multiple linear regression model
model <- lm(y ~ unlist(x1) + unlist(x2))

#view the model output
summary(model)

Call:
lm(formula = y ~ unlist(x1) + unlist(x2))

Residuals:
    Min      1Q  Median      3Q     Max 
-1.1579 -0.4211 -0.1386  0.3108  1.7130 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  8.34282    4.44971   1.875 0.102932    
unlist(x1)   1.61339    0.24899   6.480 0.000341 ***
unlist(x2)  -0.08346    0.20937  -0.399 0.702044    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8599 on 7 degrees of freedom
Multiple R-squared:  0.9887,	Adjusted R-squared:  0.9854 
F-statistic: 305.1 on 2 and 7 DF,  p-value: 1.553e-07

Once again we don’t receive any errors since we converted each of the list objects to vectors.

Additional Resources

The following tutorials explain how to perform other common operations in R:

How to Interpret glm Output in R
How to Interpret ANOVA Results in R
How to Handle R Warning: glm.fit: algorithm did not converge

I’m getting this error in remix:

Invalid type for argument in function call. Invalid implicit conversion from address to address payable requested

It refers to msg.sender on line number 9 below. Here is the code I’m writing:

function startProject(
        string calldata title,
        string calldata description,
        uint durationInDays,
        uint amountToRaise
    ) external {
        uint raiseUntil = block.timestamp.add(durationInDays.mul(1 days));
Project newProject = new Project(
    msg.sender,
    title,
    description,
    raiseUntil,
    amountToRaise
);
projects.push(newProject);

Why am I getting this error? How can I resolve it?

TylerH's user avatar

TylerH

20.7k64 gold badges72 silver badges97 bronze badges

asked Nov 21, 2021 at 7:54

GGbro's user avatar

6

The linked code contains a definition of the contract Project and its constructor:

constructor
(
    address payable projectStarter,
    string memory projectTitle,
    string memory projectDesc,
    uint fundRaisingDeadline,
    uint goalAmount
) public {
    // ...
}

It accepts address payable as the first argument. However, msg.sender is not payable by default (since Solidity 0.8.0).

Solution: Typecast the address to address payable:

Project newProject = new Project(
    payable(msg.sender),
    title,
    description,
    raiseUntil,
    amountToRaise
);

answered Nov 21, 2021 at 15:07

Petr Hejda's user avatar

Petr HejdaPetr Hejda

38.7k8 gold badges71 silver badges96 bronze badges

0

If you don’t yet know what the value of an address type is, pass it it in as: address(0)

answered Feb 28, 2022 at 8:32

Atang Motloli's user avatar

Есть таблица в кликхаус.Выполняю следующий запрос используя метод extract.

select * from posts where extract(text,'(виртуальныw{,4}s|дата-центрw{,4}s)') LIMIT 200

При выполнение запроса выходит следующая ошибка:

Code: 59, e.displayText() = DB::Exception: Invalid type for filter in PREWHERE: Array(String) (version 21.1.3.32 (official build))

Гуглил гугл ответов не дал.Думал дело в неправильности регулярного выражения но проверил через этот сайт регулярка правильная.
Что я делаю не так ?

задан 17 фев 2021 в 9:52

Raharasomaha's user avatar

RaharasomahaRaharasomaha

4521 золотой знак5 серебряных знаков22 бронзовых знака

3

Я не могу воспроизвести ошибку – получаю ‘Invalid type for filter in WHERE: String’:

SELECT toString(number) AS text
FROM numbers(5)
WHERE extract(text, '(виртуальны\w{,4}\s|дата-центр\w{,4}\s)')

/*
Received exception from server (version 21.2.3):
Code: 59. DB::Exception: Received from localhost:9000. DB::Exception: Invalid type for filter in WHERE: String.
*/

Тем не менне используйте функции empty или notEmpty, чтобы исправить ошибку:

SELECT toString(number) AS text
FROM numbers(5)
WHERE empty(extract(text, '(виртуальны\w{,4}\s|дата-центр\w{,4}\s)'))

/*
┌─text─┐
│ 0    │
│ 1    │
│ 2    │
│ 3    │
│ 4    │
└──────┘
*/

ответ дан 17 фев 2021 в 18:22

vladimir's user avatar

vladimirvladimir

3011 серебряный знак8 бронзовых знаков

2

Цитата
Сообщение от mersinvald
Посмотреть сообщение

А как правильно объявлять динамические массивы?

Как создать двумерный массив неконстантного размера в С++

Существует несколько способов. Рассмотрим их на примере двумерного массива ‘array’ размера N x M с элементами типа ‘int’. При этом ни N, ни M не являются константами времени компиляции.

1. Простейший способ: вектор векторов

C++
1
vector<vector<int>> array(N, vector<int>(M));

В результате будет определен вектор векторов, представляющий двумерный массив N x M, заполненный изначально нулями.

Синтаксис доступа – привычный ‘array[i][j]’.

Передача в функции – как ‘vector<vector<int>> &’

C++
1
2
3
4
5
6
void swapel(vector<vector<int>> &array)
{
  int N = array.size();
  int M = array[0].size();
  swap(array[0][0], array[N - 1][M - 1]);
}

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

2. Моделирование двумерного массива через одномерный с пересчетом индексов

C++
1
int *array = new int[N * M]();

Это создаст одномерный массив размера N*M, заполненный нулями.

Чтобы доступиться к элементу по двумерному индексу [i][j] просто выполняем пересчет индексов по формуле ‘i * M + j’, т.е. доступаемся к элементу ‘array[i * M + j]’. (На самом деле именно так работают встроенный тип “массив” в языках С и С++ для любой размерности массива.)

Передача в функцию – очевидным образом

C++
1
2
3
4
5
void swapel(int *array, int N, int M)
{
  swap(array[0], array[(N - 1) * M + (M - 1)]);
  // или просто swap(array[0], array[N * M - 1]);
}

Освобождение памяти

Понятно, что в этом способе вместо голого массива можно использовать ‘std::vector’.

3а. “Рваный” массив с индивидуальным выделением памяти

C++
1
2
3
int **array = new int*[N];
for (int i = 0; i < N; ++i)
  array[i] = new int[M]();

Синтаксис доступа – привычный ‘array[i][j]’.

Передача в функции

C++
1
2
3
4
void swapel(int **array, int N, int M)
{
  swap(array[0][0], array[N - 1][M - 1]);
}

Освобождение памяти

C++
1
2
3
4
for (int i = 0; i < N; ++i)
  delete[] array[i];
 
delete[] array;

Несложно догадаться, что этот способ – это практически то же самое, что и способ 1, только с голыми массивами вместо векторов.

3б. “Рваный” массив с общим выделением памяти

C++
1
2
3
4
int **array = new int*[N];
int *data = new int[N * M]();
for (int i = 0; i < N; ++i, data += M)
  array[i] = data;

Синтаксис доступа и передача в функции – как и в предыдущем способе.

Освобождение памяти

C++
1
2
delete[] array[0];
delete[] array;

Если внимательно посмотреть на способ 2 и способ 3б, то можно заметить, что они очень похожи. В обоих случаях сами данные хранятся в одномерном массиве размера N*M. Разница только в том, что в способе 2 вычисление финального индекса делается через полную формулу, а в способе 3б это вычисление частично уже выполнено для начала каждой строки двумерного массива и указатели на эти начала сохранены в дополнительном массиве указателей.

Добавлено через 11 минут

Цитата
Сообщение от mersinvald
Посмотреть сообщение

А как правильно объявнять динамические массивы?

Разумеется, вышеприведенные разглагольствования на тему динамических массивов вам нужны только в том случае, если вам действительно нужен массив неконстантного размера в программе. Т.е. если величина ‘Size’, например, вводится пользователем или читается из файла, т.е. заранее не известна.

Если же величина ‘Size’ жестко задана на стадии компиляции, то все эти усилия становятся ненужными. Просто объявите ее глобально как

и смело пользуйтесь обычными встроенными массивами размера ‘Size’.

Добавить комментарий