Concerning the first question, you could try the following code:

```
var("x")
@interact
def Taylor(
f = input_box(default="e^x", type=str),
n = slider(vmin=0, vmax=10, step_size=1,
default=3, label="Select the order n: ")):
try:
f = SR(f)
if x not in f.variables():
print("Illegal input. Try again")
else:
print("Taylor expansion:\n")
print(f, " = " , f.series(x==0, n))
except TypeError:
print("Please, finish typing a valid function")
```

See this SageMath Cell.

The first problem we have to face arises when SageMath reads the contents of the input box. In a Jupyter notebook, this happens many times per second while you type; in a SageMath Cell, just after hiting the Enter key. Without the `type=str`

option in `input_box`

, SageMath expects `f`

to be an expression, so it can raise several kinds of errors, such as `SyntaxError`

or `NameError`

exceptions, for example, if the input is `e^x+`

(due to an unexpected EOF while parsing) or `e^x+y`

(if `y`

has not been defined as a variable). The option `type=str`

avoids these errors, since `f`

is just a string.

Now we can type a string without annoying error messages (well, still not; see below). The string is stored in `f`

. But, before computing any series expansion, we have to convert `f`

to a symbolic expression, done in the line `f = SR(f)`

, and check if `x`

is a variable present in `f`

. Hence, something like `sin(a*x)`

is allowed, whereas `t^2`

just yields the error message «Illegal input…». If `f`

contains a valid function, the Taylor expasion is obtained and printed. Then, in any case, the user can modify the expression or type a new one.

Why the main code is inside a `try/except`

block? Suppose you want the expansion of `e^(x^2)`

. While you type, the content of the input box is processed. So, after writing, say `e^(x^`

, SageMath would raise a `TypeError`

exception, since `e^(x^`

is a malformed expression. Thanks to the the `try/except`

commands, we can catch these errors and print a message to invite the user to finish typing.

Finally, I have replaced the `taylor`

method by the `series`

one, since, in general, `f`

is not equal to the Taylor polynomial.

Concerning the second question, you can use similar code, like the following one:

```
R.<x,y,z> = PolynomialRing(QQ)
@interact
def Taylor(
f = input_box(default="x+y+z", type=str)):
try:
f = SR(f)
if f not in R:
print("Illegal input. Try again")
else:
print("The polynomial belongs to R")
except TypeError:
print("Please, finish typing a polynomial")
```

See this SageMath Cell

**EDIT**.

According to Sébastien comment, it is better to move part of the code to an `else`

clause. So, here we have a reformulation of the code:

```
var("x")
@interact
def Taylor(
f = input_box(default="e^x", type=str),
n = slider(vmin=0, vmax=10, step_size=1,
default=3, label="Select the order n: ")):
try:
f = SR(f)
except TypeError:
print("Please, finish typing a valid function")
else:
if x not in f.variables():
print("Illegal input. Try again")
else:
print("Taylor expansion:\n")
print(f, " = " , f.series(x==0, n))
```

And also, for the second script:

```
R.<x,y,z> = PolynomialRing(QQ)
@interact
def Taylor(
f = input_box(default="x+y+z", type=str)):
try:
f = SR(f)
except TypeError:
print("Please, finish typing a polynomial")
else:
if f not in R:
print("Illegal input. Try again")
else:
print("The polynomial belongs to R")
```